どういうことなのか私一人では解決できないので、質問させてください。
参考書は プログラマの考え方がおもしろいほど身につく本 を使っています。
文字列に文字を動的メモリの割り当てを使って追加する関数appendをつくっています。
そこで、うまくいくケースと、想定外のケースが用意されていました。
うまくいくケースはわかりました。
問題は想定外のケースで、関数appendに文字列と文字を指定するのですが、
指定する文字列がゼロ(nullを含む)の場合、したに載せるプログラムではうまく動かないと
私は思うのですが、メモリリークせずにうごいています。
下のプログラムでのappend関数の2回目の呼び出しでは、
27行目で、sの内容は 0 なので、実行時エラーにはならないのでしょうか?
0(ゼロ)を文字列終端文字としています。
下のプログラムは参考書のプログラムに、多少追加しています。
#include <crtdbg.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
typedef char * arrayString;
void append( arrayString &s, char c ) {
int oldLength = 0;
while( s[oldLength] != 0 ) {
oldLength++;
}
arrayString newS = new char[oldLength + 2];
for( int i=0; i<oldLength; i++ ) {
newS[i] = s[i];
}
newS[oldLength] = c;
newS[oldLength + 1] = 0;
// 2回目の呼び出しで、この条件にはひっかからない?
if( 0 == s )
cout << "NULL" << endl;
delete s;
s = newS;
}
int main()
{
// メモリリーク検出
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
cout << "First" << endl;
char *a = new char[5];
a[0] = 't'; a[1] = 'e'; a[2] = 's'; a[3] = 't'; a[4] = 0;
append( a, '!' );
cout << a << endl;
delete a;
cout << "Second" << endl;
char *b = new char[1];
b[0] = NULL;
append( b, '!' );
cout << b << endl;
delete b;
return 0;
}