私は現在、メモリーを大量に消費するアプリケーションを最適化しています。私が次のコードでやろうとしているのは、ファイルストリームオブジェクトifstream
とofstream
を動的に割り当てて、使用がなくなった後に正確に解放することです。このコードはofstream
の割り当て/割り当て解除のために完全に機能しますが、ifstream
のメモリ内容の割り当てが解除されると、セグメンテーション違反のため実行時にクラッシュします。ユーザが機能を保存する連想させる場合、上記のコードは、バイナリファイルにオブジェクトを保存予期しないランタイムエラー(セグメンテーションフォールト)
#include <fstream>
using namespace std;
// Dummy class to emulate the issue at hand
class dummy {
private:
int randINT;
static bool isSeeded;
public:
dummy() { randINT=rand(); }
int getVal() { return randINT; }
};
bool dummy::isSeeded=false;
int main(int argc, const char* argv[]) {
// Binary file I/O starts here
dummy * obj;
ofstream * outputFile;
ifstream * inputFile;
outputFile=new ofstream("bFile.bin",ios::binary);
if (!(*outputFile).fail()) {
obj=new dummy;
cout << "Value to be stored: " << (*obj).getVal() << "\n";
(*outputFile).write((char *) obj, sizeof(*obj)); // Save object to file
(*outputFile).close();
delete obj;
// don't assign NULL to obj; obj MUST retain the address of the previous object it pointed to
} else {
cout << "Error in opening bFile.bin for writing data.\n";
exit(1);
}
delete outputFile; // This line throws no errors!
inputFile=new ifstream("bFile.bin",ios::binary);
if (!(*inputFile).fail()) {
(*inputFile).read((char *) obj,sizeof(dummy)); // Read the object of type 'dummy' from the binary file and allocate the object at the address pointed by 'obj' i.e. the address of the previously de-allocated object of type 'dummy'
cout << "Stored Value: " << (*obj).getVal() << "\n";
(*inputFile).close();
} else {
cout << "Error in opening bFile.bin for reading data.\n";
exit(1);
}
delete inputFile; // Runtime error is thrown here for no reason!
cout << "\n-----END OF PROGRAM-----\n";
}
以下は、元のコードの抜粋です。上のコードで説明したように、inputFile
ポインタの割り当て解除によって実行時エラーが発生します。
私はclang(より具体的にはclang ++)を使用してプロジェクトをコンパイルしています。
ありがとうございます。
あなたの質問を[編集]して[mcve]を提供してください。 –
あなたはJavaまたはC#の背景から来ていますか? C++では、オブジェクトのインスタンスを作成するために 'new'を使う必要がないからです。ポインタの数が減るとポインタが少なくなります。ポインタを間違って使用するとクラッシュの最も一般的な原因になるためです。 –
'outputFile = new ofstream(" bFile.bin "、ios :: binary);'は非常に悪い考えです...あなたは故意に[RAII](https://en.wikipedia.org/wiki/)を倒そうとしていますか? Resource_acquisition_is_initialization)? – WhiZTiM