C++ 触发的类模板类型为的断点(析构函数)是其自身的版本吗?

C++ 触发的类模板类型为的断点(析构函数)是其自身的版本吗?,c++,class,templates,destructor,C++,Class,Templates,Destructor,对于这样一个类: 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;

对于这样一个类:

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;
    }
};
当我删除该行时(因为我知道它导致错误,但我不知道原因)

或者改成

 b.getptr().getptr() = 5;
一切正常。


那么,为什么在使用时会触发断点呢

 b.getptr() = a;
但是

它仍然可以打印正确的输出。 有人能解释我做错了什么或错过了什么吗?我自己也尝试过寻找答案,但我仍然无法理解问题所在,也无法找到解决问题的方法。 多谢各位



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

在说明之后

b.getptr() = a;
a
b
都包含指向相同分配值的指针

这是因为
b.getptr()
返回对受管
(*ptr)
的引用,即
测试
,在
a
中复制
a
中的
ptr
(*ptr).ptr

因此,在
main()
的末尾,您删除了相同分配内存的两倍:crash

嗯。。。不能保证崩溃(您有未定义的行为),但通常会发生崩溃。(感谢阿尔及达斯·普雷季约乌斯指出了这一点)

当您直接管理分配的内存时,需要复制构造函数,并且需要定义一个
操作符=()
,以避免此类问题。
从C++11开始,您还需要一个move构造函数和一个
操作符=()
,以接收正确的引用

我假设,您的意图不是
test(intx){ptr=new int;*ptr=x;}
,而是
test(Type x){ptr=new Type;*ptr=x;}
,您可能想看看@AlgirdasPreidžius的“test(const-test&other)”这不是一个复制构造函数吗?另外,“test c=a;”不会像我上面提到的那样导致任何崩溃(当我删除我怀疑一切正常的行时)@G.M.谢谢,问题解决了everything@Tr伊特尔ầnMinh-是:您已经完成了复制构造函数;但是您还需要一个显式的
操作符=(testconst&)
;当你写
b.getptr()=a
不是复制构造函数,而是起作用的
运算符=()
。“删除两次相同的分配内存:崩溃”从技术上讲,双重删除操作是未定义的行为。只有当你“幸运”的时候,你才会被撞车。@AlgirdasPreidžius-我经常“幸运”:(。
 b.getptr().getptr() = 5;
 b.getptr() = a;
test<int> c = a;
b.getptr().getptr() = 5;
cout << typeid(b.getptr()).name() << endl; // Print "class test<int>"
b.getptr() = a;
b.getptr() = a;