gpt4 book ai didi

带指针的 C++ 结构 : constructor and destructor

转载 作者:太空狗 更新时间:2023-10-29 21:47:34 26 4
gpt4 key购买 nike

我在使用调用 DLL 来执行优化任务的模拟程序时遇到问题。在研究了一段时间后,我认为我的问题出在DLL返回所需信息后用于释放内存的析构函数上。仿真程序在Borland C++ Builder v6上开发,DLL在MS Visual C++ 2005上开发。

为了模拟程序(P)和DLL交换数据,我创建了两个结构体InputCPLEXOutputCPLEX和一个函数 optimize它有两个参数:一个类型为 InputCPLEX 的对象和一个 OutputCPLEX 类型的对象.两个结构都在头文件中声明 structures.h属于P工程和DLL工程。

两者都是 InputCPLEXOutputCPLEX结构有intint*成员,所以基本上是文件 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 提供更多信息(出于优化目的),因此在运行大型模拟(涉及大型数据集)时,模拟程序一直系统性崩溃。额外的信息是两个结构中的指针,我的猜测是程序正在泄漏内存,所以我尝试编写一个构造函数和一个析构函数,以便将内存分配给结构 inputoutput可以妥善管理。我尝试了以下在互联网上搜索的代码:

//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 中同时删除构造函数和析构函数文件,那么模拟程序仍然能够执行涉及小数据集的小模拟。

非常感谢您的帮助,大卫。

最佳答案

您必须使用一致的新建-删除方式。如果某些东西被 new[] 获取,你应该用 delete[] 删除它,如果用 new -> 删除 delete。在您的代码中,您通过 new 创建 inputoutput,但通过 delete[] 删除。

顺便说一句,您不必在删除前检查指针是否为零。 delete 可以毫无问题地处理零指针。

关于带指针的 C++ 结构 : constructor and destructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12856085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com