【发布时间】:2012-10-15 17:44:14
【问题描述】:
我在调用 DLL 以执行优化任务的模拟程序时遇到问题。在研究了这个问题一段时间后,我认为我的问题在于我在 DLL 返回所需信息后用于释放内存的析构函数。仿真程序是在Borland C++ Builder v6上开发的,DLL是在MS Visual C++ 2005上开发的。
为了模拟程序 (P) 和 DLL 交换数据,我创建了两个结构 InputCPLEX 和 OutputCPLEX 和一个函数 optimize,它接受两个参数:一个类型为 InputCPLEX 的对象和一个类型为输入OutputCPLEX。这两个结构都在属于 P 项目和 DLL 项目的头文件structures.h 中声明。
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文件中的构造函数和析构函数都删除了,那么模拟程序仍然能够执行小型模拟,涉及到小数据集。
非常感谢您的帮助, 大卫。
【问题讨论】:
-
delete在空指针上无效。析构函数中的ifs 是不必要的。你应该关注rule of three。 -
你好,空指针上的>
delete是什么意思没有效果你的意思是当我删除对象input和output时它会自动删除它们的成员,所以我不需要在析构函数中声明? -
表示删除前不必检查指针是否为NULL。
-
好的,我明白了,我将删除
ifs。谢谢
标签: c++ dll struct destructor