【发布时间】:2021-08-30 11:01:32
【问题描述】:
我试图在 C++ 中找出删除运算符和析构函数之间的区别,并尝试使用以下两个 sn-ps(我使用 Visual Studio 2019 编译它们):
代码 1:
#include <stdio.h>
class A
{
public:
A() { a = new int; *a = 42; b = 33; }
~A()
{
printf("destructor!\n");
delete a;
}
int* a;
int b;
};
int main(int argc, const char** argv)
{
A* myA = new A();
printf("a:%d b:%d\n", *(myA->a), myA->b);
//delete myA;
myA->~A();
printf("b:%d\n", myA->b);
printf("a:%d\n", *(myA->a));
}
code2:(和code 1差不多,只是将use delete改为使用destructor)
#include <stdio.h>
class A
{
public:
A() { a = new int; *a = 42; b = 33; }
~A()
{
printf("destructor!\n");
delete a;
}
int* a;
int b;
};
int main(int argc, const char** argv)
{
A* myA = new A();
printf("a:%d b:%d\n", *(myA->a), myA->b);
delete myA;
//myA->~A();
printf("b:%d\n", myA->b);
printf("a:%d\n", *(myA->a));
}
从结果我猜,当你运行 myA->~A() 时,它只是执行了定义的析构函数,即 delete a,使这个指针成为悬空指针。 当您运行 delete myA 时,它不会同时执行析构函数,并使指针 myA 成为悬空指针。但我不确定这些具体是如何实现的。
两个结果不同的解释是我的第一个问题
第二个问题s:sn-p的代码是从Here复制过来的,结果也和我的不一样,希望哪位大神也能解释一下
【问题讨论】:
-
您是否阅读了有关您链接的问题的答案?他们解释说代码的第一个版本具有未定义的行为(第二个版本也有 UB 出于类似原因),即输出可以是任何东西。答案也解决了您的第一个问题
-
这能回答你的问题吗? stackoverflow.com/questions/14215140/…。为什么不呢?
-
这能回答你的问题吗? stackoverflow.com/questions/16908650/…
-
你也应该试试这个变种
int main() { A a; } -
@463035818_is_not_a_number 在您的第一个链接中,答案是“调用析构函数会释放对象拥有的资源,但不会释放分配给对象本身的内存。”我不太清楚资源与分配给对象的内存的区别。
标签: c++ destructor