gpt4 book ai didi

c++ - 在作为函数参数传递的指针上使用 delete

转载 作者:可可西里 更新时间:2023-11-01 16:26:11 26 4
gpt4 key购买 nike

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

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

现在可以正常编译了,但我只是想确保它永远是那样。

最佳答案

它总是会编译没有错误。

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

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

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

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

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

关于c++ - 在作为函数参数传递的指针上使用 delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1881681/

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