gpt4 book ai didi

c++ - 这是Item28中 "More Effective C++"的错误吗?

转载 作者:太空宇宙 更新时间:2023-11-04 13:59:45 25 4
gpt4 key购买 nike

我在阅读More Effective C++ 中的item28 时遇到了一个问题。在这一项中,作者向我们展示了我们可以使用SmartPtr中的成员(member)模板。这样 SmartPtr<Cassette>可以转换为SmartPtr<MusicProduct> .
下面的代码和书上的不太一样,但是效果是一样的。

#include <iostream>

class Base {};
class Derived : public Base {};

template<typename T>
class smart {
public:
smart(T* ptr)
: ptr(ptr)
{}

template<typename U>
operator smart<U>()
{
return smart<U>(ptr);
}

~smart()
{
delete ptr;
}
private:
T* ptr;
};

void test(const smart<Base>& ) {}

int main()
{
smart<Derived> sd(new Derived);
test(sd);
return 0;
}

确实可以编译无编译错误。但是当我运行可执行文件时,我得到了一个核心转储。我认为那是因为转换运算符的成员函数使临时智能化,它有一个指向 sd 中相同 ptr 的指针。 (它的类型是 smart<Derived> )。所以 delete 指令操作了两次。更何况,在调用test之后,我们再也不能使用sd了。不再,因为ptrsd已经被删除了。
现在我的问题是:

  • 我的想法对吗?还是我的代码和书上的原代码不一样?
  • 如果我的想法是对的,请问有什么方法可以做到吗?

非常感谢您的帮助。

最佳答案

是的,您已经相当准确地描述了代码的问题。

至于如何让它工作:当你从浅拷贝遇到问题时,就像往常一样:做一个深拷贝。也就是说,不是仅仅创建另一个指向相同数据的指针,而是需要克隆数据,并让第二个对象指向数据的克隆而不是原始数据。

或者,使用引用计数指针,并在复制时增加引用计数,在销毁拷贝时减少引用计数。当计数达到零(而不是之前)时,删除指针数据。

一般来说:避免做所有这些。假设您使用的是相对最新的编译器,标准库应该已经包含一个 shared_ptr 和一个可以处理 lot 您的智能指针需求。

关于c++ - 这是Item28中 "More Effective C++"的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19781656/

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