【发布时间】:2018-04-13 06:59:38
【问题描述】:
在下面的练习中,我创建了一个基类和几个派生类之间的多态关系:
#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;
}
我已将基类析构函数设置为 virtual 并删除函数“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”命令时,这些来自内存泄漏检测器的错误完全消失了。
有人可以向我解释一下这里发生了什么吗?我的教科书理解告诉我,我需要删除指向基类的指针以防止内存错误并避免不可预知的程序行为,但我似乎遇到了完全相反的情况。
【问题讨论】:
-
只有通过
new获得的delete指针。您的对象在堆栈上,因此您无需执行任何操作。
标签: c++ memory-management memory-leaks polymorphism