gpt4 book ai didi

c++ - 删除调用析构函数但不删除对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:04:37 25 4
gpt4 key购买 nike

所以我已经使用 C++ 和指针工作了一年半,我认为我已经成功了。我之前多次调用对象的 delete 并且对象实际上被删除了,或者至少我认为他们删除了。

下面的代码让我很困惑:

#include <iostream>

class MyClass
{
public:
int a;

MyClass() : a(10) {
std::cout << "constructor ran\n";
}

void method(std::string input_) {
std::cout << param_ << "\n";
}

~MyClass() {
std::cout << "destructor ran\n";
}

};

int main()
{

MyClass* ptr = new MyClass;

ptr->method("1");

delete ptr;

ptr->method("2.5");

}

此代码输出:

constructor ran
1
destructor ran
2.5

我很困惑为什么它没有抛出任何类型的错误 - 我期待内存越界异常或类似的异常,但没有。 for 循环就在那里,以防存在某种隐藏的垃圾回收,尽管据我所知在 c++ 中没有垃圾回收。

任何人都可以解释为什么这段代码有效,或者这段代码哪里出了问题,因为它没有给我错误?

最佳答案

您误解了delete 的作用。 delete 所做的只是调用析构函数,并告诉分配器该内存是空闲的。它不会改变实际的指针。超出此范围的任何内容都是未定义的。

在这种情况下,它对指向的实际数据没有任何作用。该指针指向它之前指向的相同数据,并且调用它的方法工作得很好。但是,不能保证这种行为;事实上,它是明确未指定的。 delete 可以将数据清零;或者分配器可以为其他东西分配相同的内存,或者编译器可以拒绝编译它。

为了性能,C++ 允许您做许多不安全的事情。这是其中之一。如果您想避免此类错误,最好这样做:

delete ptr;
ptr = NULL;

确保您不会尝试重用指针,如果您重用指针会立即崩溃,而不是出现未定义的行为。

关于c++ - 删除调用析构函数但不删除对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18990524/

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