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

C++ 对作为函数参数传递的指针使用delete,c++,memory-management,new-operator,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(){ te

删除作为函数参数传递的指针是否可以(并且合法),例如:

#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);
    }
}
#包括
班级考试{
公众:
test_class():h(9){}
int-h;

~test_class(){std::cout是的,这是完全合法的。您可以
从任何位置删除
指针,只要它指向堆上分配的某个对象(或等于
0

调用者是否期望其对象被函数删除,这是另一个问题。

是的,这是有效的


这通常在C中完成(显然,使用malloc和free而不是new和delete)在C++中,一般使用其他内存管理习惯,如可以,

是的,在C++中是合法的,但这样做通常不被认为是一个好的实践。对于<代码> < <代码> >的类,最好是<代码>删除>代码>。

这样做是完全合法的。hat该指针在该点之后不会在调用方中使用。通常,执行删除操作的函数的名称应表明正在发生的情况(例如,包含删除、释放、释放等)。另一个潜在问题是确保指向的数据分配了new而不是new[].

这是完全合法的,不过在这种情况下,最好使用类似的方法来管理内存所有权。

这是有效的,并且在为对象编写清理方法时非常有用,尽管有9/10次您希望将清理逻辑放入析构函数中

不过,编写单独清理的一个很好的理由是,如果您想让对象保持“活动”状态,但暂时不使用,可能是在一个数组或对象池中,当您需要一个新的对象时,偶尔会从中提取,而不需要构造函数开销


如果要传入指针,应检查以确保它们不为null,以避免任何未定义的行为。

它将始终编译无误

将指针传递到函数并在该函数中删除它是否是一件好事可能是另一回事,这取决于程序的具体情况

你需要考虑的主要观点是“所有权”。指向数据的。当您传递该指针时,调用函数是否拥有传入数据的所有权?即,它是否位于唯一可以引用该数据的位置?您是否放弃指向数据的所有权,而调用函数不可能再次引用该数据?如果是,则必须埃莱特

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

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


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

我在给定代码中的任何地方都没有看到类“执行新操作”。您可能指的是“块”而不是“类”,但这并不总是可能的或有用的。但该类可能会使用一个以指针为参数的函数来执行删除操作。我一直感到惊讶的是,删除指针是合法的,即使它是
const