gpt4 book ai didi

c++ - 什么时候调用 'delete' 创建的临时对象 `new` ?

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:35 24 4
gpt4 key购买 nike

我用 new Time(1,0,0) 初始化 SmartPtr 类。

    //main.cpp 
int main()
{
SmartPtr pTime0(new Time(0,0,1));
}

我没有在 new Time(1,0,0) 上调用 delete。一切正常,程序符合并运行。但我很困惑——我应该/不应该在哪里 delete Time(1,0,0)

这里临时对象的创建和删除的概念我不明白。我知道每当我在某个地方写 new 时,我都必须写 delete !有人可以解释一下 delete Time(1,0,0) 发生在哪里吗?

SmartPtr pTime0(new Time(0,0,1)) <-- new 这里返回一个指向新分配内存的指针,然后在ctor中我分配new 内存第二次??

//SmartPtr.cpp 

SmartPtr::SmartPtr(Pointee * p):_pointee(new Pointee(*p))
{}

SmartPtr::~SmartPtr()
{
delete _pointee;
}

最佳答案

我不知道你的 SmartPtr 类的细节。

无论如何,如果您有这样的构造函数:

SmartPtr::SmartPtr(Pointee * p):_pointee(new Pointee(*p))
{}

这是析构函数:

SmartPtr::~SmartPtr()
{
delete _pointee;
}

然后用这段代码:

SmartPtr pTime0(new Time(0,0,1));

你泄露了 Time(0,0,1) 的一个实例。

事实上,你的newdelete多了一个(2个new和1个delete):

第 1 步:您调用 new Time(0,0,1) 并在堆上创建一个新对象。
( 计数 == 1)

第 2 步:您将此指针传递给 SmartPtr 构造函数,该构造函数深度复制先前创建的对象并在堆上分配一个新拷贝,并跟踪此拷贝通过它的 _pointee 数据成员。
( 计数 == 2)

第 3 步:当 SmartPtr 析构函数运行时,它会删除_pointee 数据成员指向的实例,但是您 泄露了在堆上用new Time(0,0,1)创建的第一个Time(...)
(delete count == 1; new count == 2)

一个可能的解决方法是只使用这个构造函数:

SmartPtr::SmartPtr(Pointee * p)
: _pointee(p) // <--- transfer ownerhsip (no deep copies) !
{}

在这些情况下识别潜在泄漏的一种简单方法是将一些控制台跟踪输出放在 Time 类构造函数和析构函数中,并检查析构函数的跟踪输出是否与构造函数的跟踪输出相匹配,例如:

Time::Time(....)
{
// Do construction work....

std::cout << "Time constructor\n";
}

Time::~Time(....)
{
// Do destructor work....

std::cout << "Time destructor\n";
}

"Time constructor" 字符串的总数应与 "Time destructor" 字符串的总数相匹配。

关于c++ - 什么时候调用 'delete' 创建的临时对象 `new` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19012330/

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