【问题标题】:Deleting an object by function in C++按C ++中的函数删除对象
【发布时间】:2021-06-15 15:17:09
【问题描述】:

我对 C++ 中指针的行为有点好奇。所以我有这个小程序要测试,不幸的是它运行良好。

#include <iostream>

class Test{
    public:
        Test(){
            std::cout<<"Test Created!\n";
        }
        ~Test(){
            std::cout<<"Test Destroyed!\n";
        }
};

void destroyer(Test* T){
    Test* temp = T;
    delete temp;
}

int main(){
    Test* ptr = new Test();
    destroyer(ptr);
}

它会给予回报

    Test Created!
    Test Destroyed!

我得出的结论是,当我们删除一个指针时,实际上它只是删除指针所指的对象,而不是变量本身(变量指针会在程序结束时自动删除,与其他原始数据类型相同)。我的想法是真的吗?

【问题讨论】:

    标签: c++


    【解决方案1】:

    是的,delete 运算符只调用析构函数并释放指针指向的对象占用的内存。指针本身与其他任何变量一样是一个局部变量,不能(也不需要)删除。

    可能值得注意的是,调用delete ptr; 不会改变ptr 的值,因此删除指针ptr 后将指向已被释放的内存。删除该内存后访问该内存将是未定义的行为。

    【讨论】:

      【解决方案2】:

      delete 是一个查看指针对象指向的对象的运算符。指针变量仍然是一个局部值,其生命周期与声明它的作用域相关。

      您有 3 个指针对象,它们的生命周期不同。只有main 中的ptr 持续到程序结束。 Ttemp 仅在 destroyer 期间存在。

      【讨论】:

        【解决方案3】:

        我们写的时候通俗地说“删除指针”

         delete x;
        

        但是,这并不完全准确。删除的是x指向的对象。

        我的结论是,当我们删除指针时,实际上它只是删除了指针引用的对象而不是变量本身(变量指针会在程序结束时自动删除,与其他原始数据类型相同)。我的想法是真的吗?

        是的。

        实际上,上面提到的不准确性很好,因为在删除对象后,如果不调用实现定义或未定义的行为,就无法使用指针值,这也会影响指向同一对象的其他指针:

           int* x = new int(42);
           int* y = x;
           detele x;
           std::cout << x << y;   // implementation defined
           std::cout << *x << *y; // undefined
           x = new int(42);       // OK
        

        详情见here

        【讨论】:

          猜你喜欢
          • 2021-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-16
          • 1970-01-01
          相关资源
          最近更新 更多