gpt4 book ai didi

c++ - 如果他们在 C++ 中的私有(private)函数中分配内存,是否可以在析构函数中释放内存?

转载 作者:太空狗 更新时间:2023-10-29 20:00:28 25 4
gpt4 key购买 nike

我试图在全局范围内定义一个类,其中包含一些动态分配的数组。当调用类的构造函数时,程序无法访问通过参数文件读取的用户定义参数(即模拟中的年数),因此它无法将内存分配到适当的大小。我的想法是在类的私有(private)函数中分配内存,然后使用析构函数释放它。一些示例代码:

class Simulation{
private:
int initial_call; //a flag used to initialize memory
double *TransferTracker;
public:
Simulation();
~Simulation();
void calc();
};

Simulation simulator; //global instance of Simulation

Simulation::Simulation()
{
initial_call = 1;
}
Simulation::~Simulation()
{
//when calling the destructor, though, the address is
//0xcccccccc and the following attempt to delete produces
//the compiler error.
delete [] TransferTracker; //see error
}
void Simulation::calc()
{
for (int i = 0; i < num_its; i++)
{
if (initial_call)
{
TransferTracker = new double [5];
//The address assigned is, for example, 0x004ce3e0
initial_call = 0;
}
}
//even if this calc function is called multiple times, I see
//that the address is still 0x004ce3e0.
}

我从上面的代码片段收到的错误是:

 Unhandled exception at 0x5d4e57aa (msvcr100d.dll) in LRGV_SAMPLER.exe: 0xC0000005: Access    
violation reading location 0xccccccc0.

这个错误是有道理的,因为我在进入析构函数时检查了TransferTracker的内存地址。我的问题是,为什么我们在进入析构函数时会丢失地址?这可能与模拟器是全局性的事实有关;如果这个类不是全局的,这个范例似乎工作得很好。我是面向对象编程的新手,非常感谢您的帮助!

编辑:这基本上是我的失误,得到了答案的帮助。出现了两个问题:(1) 指针从未设置为 NULL,因此在尝试删除未分配的指针时造成混淆。 (2) 在我的范围内实际上有两个类的实例,这是我的错误。在最终代码中,只会有一个实例。谢谢大家!

最佳答案

初始化指针为NULL(0)

Simulation::Simulation() : TransferTracker(NULL)
{
initial_call = 1;
}
Simulation::~Simulation()
{
//when calling the destructor, though, the address is
//0xcccccccc and the following attempt to delete produces
//the compiler error.
if(TransferTracker) delete [] TransferTracker; //see error
TransferTracker = NULL;
}

这样你可以在你想删除它的时候检查它是否已经初始化。这是最佳实践,因此请始终这样做,而不仅仅是在构建时

编辑:

void Simulation::calc()
{
for (int i = 0; i < num_its; i++)
{
if (initial_call)
{
if(TransferTracker) delete [] TransferTracker;
TransferTracker = new double [5];
initial_call = 0;
}
}
}

关于c++ - 如果他们在 C++ 中的私有(private)函数中分配内存,是否可以在析构函数中释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6820615/

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