【发布时间】:2016-12-27 01:08:04
【问题描述】:
我正在练习动态内存分配,所以我在这里创建了一个对象,一个名为 vector3d 的自定义数据类型,一个我在不同文件中定义的数学向量。但是,当我尝试使用 delete 删除对象时,我收到一个编译器错误,指出测试向量未在该范围内定义。但是,我在对象析构函数中有一个调试 cout 打印函数,以确保它被调用并且没有被调用。
int main()
{
while(continueProgram == true)
{
vector3d *a;
a = new vector3d("Test vector");
std::cout << a->getName() << std::endl;
vector3d b("Test vector 2");
std::cout << b.getName() << std::endl;
continueProgram = prompt(); // Boolean
}
delete(a); // <-- "Error: 'a' was not declared in this scope"
return 0;
}
这里是构造函数和析构函数,还有vector3d打印函数。
vector3d::vector3d(std::string s)
:name(s)
{
std::cout << "Vector constructor initialized" << std::endl;
}
vector3d::~vector3d()
{
std::cout << "Vector destructor initialized" << std::endl;
}
void vector3d::printVector()
{
std::cout << "Name: " << this->name << std::endl;
}
我不明白为什么我不能在这里调用 delete 函数,因为我认为使用 New 关键字的全部意义在于将对象保留在其范围之外。否则我只会初始化为
vector3d a("Test vector");
就像我对 vector3d b 所做的那样,对吧?我不明白为什么我会在这里遇到范围错误
这是程序在运行时的控制台输出,当我注释掉删除行并键入“n”结束程序时:
Vector constructor initialized
Test vector
Vector constructor initialized
Test vector 2
Continue program? y/n
n
Vector destructor initalized
所以只有vector3d b出现的析构函数,而不是vector3d a
【问题讨论】:
-
// 编译器是正确的。
a在 while 循环中声明。 -
我将如何删除该对象?有没有办法指定我指的是哪个对象?
标签: c++ memory-leaks