作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的练习中,我创建了一个基类和几个派生类之间的多态关系:
#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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!