gpt4 book ai didi

c++ - 防止多态类中的内存泄漏

转载 作者:行者123 更新时间:2023-11-30 03:24:17 24 4
gpt4 key购买 nike

在下面的练习中,我创建了一个基类和几个派生类之间的多态关系:

#include <iostream>
using namespace std;

class Panthera
{
public:
virtual void roar() = 0;
virtual ~Panthera() {}
};

class Lion : public Panthera
{
public:
void roar() { cout << "roaring like a lion... " << endl; }
};

class Tiger : public Panthera
{
public:
void roar() { cout << "roaring like a tiger..." << endl; }
};

class Jaguar : public Panthera
{
public:
void roar() { cout << "roaring like a jaguar... " << endl; }
};

class Leopard : public Panthera
{
public:
void roar() { cout << "roaring like a leopard... " << endl; }
};

void speak(Panthera *object)
{
object->roar();

delete object; // this is meant to prevent memory leak

cout << "deleting pointer... " << endl;
}

int main()
{

Lion lion;
Tiger tiger;
Jaguar jaguar;
Leopard leopard;

speak(&lion);
speak(&tiger);
speak(&jaguar);
speak(&leopard);

cout << "program ending... " << endl;

}

我已将基类析构函数设置为虚拟并删除函数“speak”中的指针以防止内存泄漏,虽然代码确实编译和运行而没有任何警告或错误,但我从内存泄漏中得到以下结果探测器:

Error #1: INVALID HEAP ARGUMENT to free 0x0028ff2c
# 0 replace_free [d:\drmemory_package\com...
# 1 Lion::~Lion [../src/bigCats.cpp:11]
# 2 speak [../src/bigCats.cpp:39]
# 3 main [../src/bigCats.cpp:52]
Note: @0:00:01.466 in thread 7936

Error #2: INVALID HEAP ARGUMENT to free 0x0028ff28
# 0 replace_free [d:\drmemory_package\com...
# 1 Tiger::~Tiger [../src/bigCats.cpp:17]
# 2 speak [../src/bigCats.cpp:39]
# 3 main [../src/bigCats.cpp:53]
Note: @0:00:01.482 in thread 7936

Error #3: INVALID HEAP ARGUMENT to free 0x0028ff24
# 0 replace_free [d:\drmemory_package\com...
# 1 Jaguar::~Jaguar [../src/bigCats.cpp:23]
# 2 speak [../src/bigCats.cpp:39]
# 3 main [../src/bigCats.cpp:54]
Note: @0:00:01.497 in thread 7936

Error #4: INVALID HEAP ARGUMENT to free 0x0028ff20
# 0 replace_free [d:\drmemory_package\com...
# 1 Leopard::~Leopard [../src/bigCats.cpp:29]
# 2 speak [../src/bigCats.cpp:39]
# 3 main [../src/bigCats.cpp:55]
Note: @0:00:01.529 in thread 7936

我还注意到该程序偶尔会以随机间隔崩溃,尽管它似乎在大多数时间都能正常工作。奇怪的是,当我去掉“speak”函数中的“delete object”命令时,内存泄漏检测器的这些错误就完全消失了。

有人可以向我解释一下这里发生了什么吗?我的教科书理解告诉我,我需要删除指向基类的指针以防止内存错误并避免不可预测的程序行为,但我似乎遇到了完全相反的情况。

最佳答案

在 C++ 中,您必须仔细管理所有对象的生命周期。

delete x 仅对指向由 new 创建的对象的指针有效。

您在自动存储中创建了对象。无需通过delete 来防止内存泄漏,这样做是未定义的行为。

避免使用“拥有”资源的原始指针;当您必须堆分配时,请改用 unique_ptr。避免堆分配;学习 5 法则,只在需要时分配堆。

关于c++ - 防止多态类中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49811069/

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