我在调用DLL执行优化任务的模拟程序时遇到问题。在研究了这个问题一段时间之后,我认为我的问题在于DLL在返回了所需信息后用于释放内存的析构函数。所述仿真程序上的Borland C++生成器V6开发和DLL被在MS的Visual C++ 2005带指针的C++ Struct:构造函数和析构函数
对于该模拟程序(P),并交换数据的DLL开发,我创建两个结构InputCPLEX
和OutputCPLEX
和功能optimize
它有两个参数:一个类型为InputCPLEX
的对象和一个类型为OutputCPLEX
的对象。两个结构都在头文件structures.h
中声明,该文件属于P项目和DLL项目。
两个InputCPLEX
和OutputCPLEX
结构具有int
和int*
成员,因此基本文件structures.h
样子:
//structures.h
struct InputCPLEX{
public:
int i;
int* inputData;
}
struct OutputCPLEX{
public:
int j;
int* outputData;
}
的想法是,沿着模拟过程(P的执行),我定期调用DLL要解决优化问题,所以inputData
是与我的优化问题中的变量对应的数组,而outputData
是我的变量的最优值的数组。我知道使用STL容器比较容易,比如vector<int>
,但是 - 如果我错了,就纠正我 - 看起来很难在两个不同的编译器之间交换STL对象。
这里是东西怎么看在我的主文件(P):
//main.h
InputCPLEX* input;
OutputCPLEX* output;
int* var;
int* sol;
//main.cpp
[...] //lots of code
input = new InputCPLEX;
output = new OutputCPLEX;
int n = X; //where X is an integer
var = new int[n];
[...] //some code to fill var
input->i = n;
input->inputData = var;
optimize(input,output); //calls the DLL
int m = output->j;
sol = new int[n];
sol = output->outputData;
[...] //some code to use the optimized data
delete[] var;
delete[] sol;
delete input;
delete output;
[...] //lots of code
对于超过一年我一直在使用没有文件structures.h
任何构造函数和析构函数的代码,所以没有初始化结构成员被执行。正如你可能已经猜到的那样,我不是C++的专家,实际上它恰恰相反。我还想强调,我没有编写大部分的模拟程序,只是一些功能,这个程序是由几个开发人员开发超过10年,结果相当混乱。
但是,直到最近,一切正常。我决定向DLL提供更多信息(用于优化目的),因此在运行大型仿真(涉及大型数据集)时,仿真程序系统崩溃。额外的信息是两个结构中的指针,我猜测程序是在泄漏内存,所以我试图编写构造函数和析构函数,以便分配给结构input
和output
的内存可以正确管理。我想下面的代码,我发现搜索了互联网:
//structures.h
struct InputCPLEX{
public:
int i;
int* inputData;
int* inputData2; // extra info
int* inputData3; // extra info
InputCPLEX(): i(0), inputData(0), inputData2(0), inputData3(0) {}
~InputCPLEX(){
if (inputData) delete inputData;
if (inputData2) delete inputData2;
if (inputData3) delete inputData3;
}
}
struct OutputCPLEX{
public:
int j;
int* outputData;
int* outputData2;
int* outputData3;
OutputCPLEX(): j(0), outputData(0), outputData2(0), outputData3(0) {}
~OutputCPLEX(){
if (outputData) delete outputData;
if (outputData2) delete outputData2;
if (outputData3) delete outputData3;
}
}
但它不似乎工作:程序崩溃,甚至更快,只有很短的时间量之后。有人可以帮助我确定我的代码中的问题吗?我知道可能存在影响程序执行的其他因素,但是如果我在structures.h
文件中删除了构造函数和析构函数,那么仿真程序仍然能够执行包含小数据集的小模拟。
非常感谢您的协助, David。
对空指针的'delete'没有影响。析构函数中的“if”是不必要的。你应该遵循[三条规则](http://stackoverflow.com/search?q= [c%2B%2B-faq] + rule + of + three)。 –
你好,你是什么意思 >空指针上的'delete'没有效果 你是说当我删除对象'输入'和'输出'它会自动删除它们的成员,所以我不需要在析构函数中声明? – David
这意味着您在删除指针之前不必检查指针是否为NULL。 – juanchopanza