これは、1 行に 1 つの単語を含むテキスト ファイルを読み取り、すべての単語を格納するために必要なメモリを動的に割り当て、それらを画面に出力し、使用されているメモリの割り当てを解除する単純なプログラムのコードです。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
class Dict {
public:
int size;
char ** words;
Dict (int, int*);
~Dict ();
};
Dict::Dict(int s,int* sizes) {
int i;
size=s;
words = new char* [s];
for (i=0;i<s;i++)
words[i] = new char [sizes[i]];
}
Dict::~Dict() {
int i;
for (i=0;i<size;i++) {
delete [] words[i];
printf("i=%d\n",i); // for debugging
}
delete [] words;
}
Dict loadDict (char* filename) {
FILE* file;
int n=0,i=0;
int * sizes;
char buff [64];
file=fopen(filename,"r");
while (!feof(file)) {
n++;
fscanf(file,"%*[^\n] \n");
}
sizes=new int [n];
rewind(file);
while (!feof(file)) {
if (fscanf(file,"%s\n",buff)>0) {
sizes[i]=strlen(buff);
i++;
}
}
rewind(file);
Dict r(n,sizes);
i=0;
while (!feof(file)) {
fscanf(file,"%s\n",r.words[i]);
i++;
}
delete [] sizes;
return r;
}
int main() {
int i;
Dict d=loadDict("dict.txt");
for (i=0;i<d.size;i++)
printf("%s|\n",d.words[i]);
printf("%d DONE.\n",d.size);
return 0;
}
割り当て解除は Dict クラスのデストラクタで行われます。ただし、ほんの数単語のサンプル テキスト ファイルで使用すると、単語は正しく出力されますが、フォームの 3 行の実行後に を呼び出すと~Dict
アプリケーションがクラッシュしますdelete [] words[i];
。Code::Block のデバッガーを使用してその行にブレークポイントを設定し、各ブレークポイントで続行するように指示すると、プログラムは正常に終了します。
これは本当に単純なプログラムなので、何らかの簡単な答えや修正があることを願っています!