2009-12-10 175 views
9

它是好(和法律),删除已被作为一个函数参数传递,如该指针:使用删除作为函数的参数传递指针

#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); 
    } 
} 

现在这编译好,但我只是想以确保它永远是那样的。

回答

11

它将始终编译没有错误。

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

您需要考虑的主要思想是指向数据的“所有权”。当你传递该指针时,调用函数是否拥有传入的数据的所有权?即它是唯一能够引用这些数据的地方吗?您是否放弃了指向数据的所有权,调用函数不会再次引用数据?如果是这样,那么你必须删除它。

如果调用函数可能再次引用数据,那么您不得删除它。

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

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

+0

我总是发现令人惊讶的是,即使它是'const',删除指针也是合法的。 – 2009-12-10 16:51:16

2

是的,这是完全合法的。只要它指向堆上分配的某个对象(或等于0),您就可以从delete指向任何地方的指针。

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

7

是的,这是有效的。

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

6

是的,它在C++中是合法的,但这样做通常不被认为是一种好的做法。执行newdelete的班级总是更好。

+0

我没有在给定的代码中的任何地方看到“执行新的”类。你可能意思是“阻止”而不是“阶级”,但这并不总是可能的或有用的。 – 2009-12-10 15:28:17

+0

但是,该类可以使用将指针作为参数的函数进行删除。 – 2009-12-10 15:30:23

0

这样做是完全合法的。您必须确保指针在该点之后不在调用方中使用。通常,执行删除的函数的名称应该表明正在发生的事情(例如,包含删除,释放,免费等)。另一个潜在的问题是确保指出的数据分配了新的而不是新的[]。

1

这是完全合法的,但在这种情况下,最好使用类似boost::shared_ptr的内容管理内存所有权。

0

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

尽管编写单独清理的一个很好的理由是,如果你想保持对象“活着”但暂时不用,也许在你偶尔需要一个新对象时拉出的数组或对象池中而不需要构造函数的开销。

如果您要让指针通过,您应该检查以确保它们不为空以避免任何未定义的行为。

相关问题