使用 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;
a
和 b
都包含指向相同分配值的指针。
这是因为 b.getptr()
return 对托管 (*ptr)
的引用,即 test<int>
,并在其中复制 a
您复制了ptr
在 a
在 (*ptr).ptr
.
因此,在 main()
结束时,您删除了两次相同的已分配内存:崩溃!
嗯...不能保证一定会崩溃(您有未定义的行为),但经常会发生崩溃。 (感谢 Algirdas Preidžius 指出)
当你直接管理分配的内存时,你需要复制构造函数,你需要定义一个operator=()
来避免这种问题。
从 C++11 开始,您还需要一个移动构造函数和一个接收正确引用的 operator=()
。
像这样的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;
a
和 b
都包含指向相同分配值的指针。
这是因为 b.getptr()
return 对托管 (*ptr)
的引用,即 test<int>
,并在其中复制 a
您复制了ptr
在 a
在 (*ptr).ptr
.
因此,在 main()
结束时,您删除了两次相同的已分配内存:崩溃!
嗯...不能保证一定会崩溃(您有未定义的行为),但经常会发生崩溃。 (感谢 Algirdas Preidžius 指出)
当你直接管理分配的内存时,你需要复制构造函数,你需要定义一个operator=()
来避免这种问题。
从 C++11 开始,您还需要一个移动构造函数和一个接收正确引用的 operator=()
。