gpt4 book ai didi

c++ - 触发了一个断点(析构函数),类模板类型是它自己的一个版本?

转载 作者:行者123 更新时间:2023-11-28 04:44:54 26 4
gpt4 key购买 nike

像这样的类:

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()”返回对 *(b.ptr) 的引用相同,这与上面的行相同并且它们都具有相同的类型“test”吗? (这个我也测试过)

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



而且,与

b.getptr() = a;

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



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

最佳答案

指令后

b.getptr() = a;

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

这是因为b.getptr()返回对托管 (*ptr) 的引用, 那是一个 test<int> , 并在其中复制 a你复制 ptra(*ptr).ptr .

所以,在 main() 的末尾,你删除了两次相同的分配内存:崩溃!

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

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

关于c++ - 触发了一个断点(析构函数),类模板类型是它自己的一个版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49450398/

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