谁能解释一下在cpp中创建的对象的范围
#include <iostream>
using namespace std;
class box
{
public:
int i;
box* doubled ();
};
box* box::doubled ()
{
box *temp = new box;
temp->i = 2*this->i;
return temp;
}
int main ()
{
box *obj1 = new box;
obj1->i = 5;
box *obj2;
obj2 = obj1->doubled();
delete obj1;
cout << "i = " << obj2->i << endl;
return 0;
}
在上面的示例代码中,obj2 是一个指针,它保存由函数 Doubled 创建的内存。 temp 的范围应该只对函数 doubled 有效,但它也可以在 main 函数中访问。
那么谁能解释为什么会这样。我想这是一个小疑问,但无法弄清楚。
最佳答案
您没有删除函数 doubled
中动态创建的对象,因此指向它的指针当然仍然有效。运算符 new
动态分配对象,并且它们保留在内存中直到被显式销毁。只有指向内存地址的指针(temp
变量)被销毁了,但由于您返回了它的值(地址),内存仍然属于程序。实际上不删除会造成内存泄漏。
如果您希望对象在范围结束后被删除,您应该使用 std::unique_ptr
。
这是一个没有动态分配的简单示例:
T* foo ()
{
T T_instance;
return &T_instance;
}
它甚至不应该编译,消息类似于returning address of local variable or temporary
,表明T_instance
将在程序退出后销毁 foo()
.
关于c++ - cpp中对象的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12301723/