使用 class 模板类型触发了一个断点(析构函数)是它自己的一个版本?

Triggered a breakpoint (Destructor) with class template type is a version of itself?

像这样的class:

template <class Type>
class test {
    Type* ptr;
public:
    test() {
        ptr = new Type;
    }
    test(int x) {
        ptr = new int;
        *ptr = x;
    }
    test(const test<Type>& other) {
        ptr = new Type;
        *ptr = *other.ptr;
    }
    ~test() {
        delete ptr;
        cout << "Deleted " << typeid(test<Type>).name() << endl;
    }

    Type& getptr () {
        return *ptr;
    }
};

并使用它:

int main() {
    test<int> a = 5;     // This seems to be fine
    test<int> c = a;     // This seems to be fine
    test<test<int>> b;
    b.getptr() = a;      // This seems fine to me

    cout << b.getptr().getptr() << endl;  // This worked (Printed 5)

    return 0;
}

然后在

行触发断点
delete ptr;

当我删除该行时(因为我知道它导致错误但我不知道为什么)

 b.getptr() = a;

或改为

 b.getptr().getptr() = 5;

一切正常。


那么为什么我使用

时会触发断点
 b.getptr() = a;

但是

test<int> c = a;
b.getptr().getptr() = 5;

都有效?它们是否与 "b.getptr()" return 对 *(b.ptr) 的引用相同,这与上面的行相同并且它们都具有相同的类型 "test"? (我也测试了这个)

cout << typeid(b.getptr()).name() << endl; // Print "class test<int>"



而且,

b.getptr() = a;

它仍然打印出正确的输出。 有人可以解释我做错了什么或遗漏了什么吗?我已经尝试自己寻找答案,但我仍然无法理解问题出在哪里,也无法找到解决问题的方法。 谢谢。



对不起,我的英语很糟糕,也正因为如此,我找不到更好的方式来在标题中更好地描述我的问题。

指令后

b.getptr() = a;

ab 都包含指向相同分配值的指针。

这是因为 b.getptr() return 对托管 (*ptr) 的引用,即 test<int>,并在其中复制 a 您复制了ptra(*ptr).ptr.

因此,在 main() 结束时,您删除了两次相同的已分配内存:崩溃!

嗯...不能保证一定会崩溃(您有未定义的行为),但经常会发生崩溃。 (感谢 Algirdas Preidžius 指出)

当你直接管理分配的内存时,你需要复制构造函数,你需要定义一个operator=()来避免这种问题。 从 C++11 开始,您还需要一个移动构造函数和一个接收正确引用的 operator=()