对作为函数参数传递的指针使用delete

Sco*_*gan 9 c++ memory-management new-operator

删除已作为函数参数传递的指针(如下所示)是否合法(和合法):

#include<iostream>

class test_class{
public:
    test_class():h(9){}
    int h;
    ~test_class(){std::cout<<"deleted";}
};

void delete_test(test_class* pointer_2){
    delete pointer_2;
}

int main(){
    test_class* pointer_1;

    while(true){
        pointer_1 = new test_class;

        //std::cout<<pointer_1->h;

        delete_test(pointer_1);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个编译好了,但我只是想确保它永远都是那样.

小智 13

它总是编译没有错误.

将指针传递给函数并在该函数中删除它是否是一件好事可能是另一个故事,具体取决于程序的细节.

您需要考虑的主要想法是指向数据的"所有权".当你传递那个指针时,调用函数是否拥有传入数据的所有权?即它是唯一可以引用此数据的地方?您是否放弃了指向数据的所有权,而且调用函数不会再次引用数据?如果是这样,那么你必须删除它.

如果调用函数可能再次引用数据,则不能删除它.

如果通过各种数据结构存在对数据的其他引用,则删除此数据是不安全的,除非您的代码中有一些规则以确保您永远不会再从这些地方引用数据.这很难做到,并且是许多编程错误的根源.

C++ tr1的shared_ptr <>是一个智能指针,有助于在这种情况下 - 它通过保持跟踪数据引用数量的引用计数来管理这种所有权概念.如果引用计数为1,则有1个明确的所有者.如果引用计数大于1,则共享所有权.如果引用计数为0,则不再有对数据的引用,并且shared_ptr <>将在调用shared_ptr <>析构函数时将其删除.


Jam*_*lis 7

是的,这是有效的.

这通常在C中完成(显然有malloc和free而不是new和delete).在C++中,如果可以的话,通常最好使用其他内存管理习惯用法,如RAII.


Nav*_*een 6

是的,它在C++中是合法的,但这样做通常不被认为是一种好的做法.它始终是其执行类更好new,以delete相同的.