gpt4 book ai didi

c++ - 析构函数如何知道何时激活自己?可以依靠吗?

转载 作者:太空狗 更新时间:2023-10-29 19:47:16 24 4
gpt4 key购买 nike

例如我有以下代码(纯示例):

class a {
int * p;
public:
a() {
p = new int;
}
~a() {
delete p;
}
};

a * returnnew() {
a retval;
return(&retval);
}

int main() {
a * foo = returnnew();
return 0;
}

在 returnnew() 中,retval 会在函数返回后被销毁吗(当 retval 超出范围时)?或者它会在我返回地址后禁用自动销毁并且我可以说 delete foo;在 main() 的末尾?或者,以类似的方式(伪代码):

void foo(void* arg) {
bar = (a*)arg;
//do stuff
exit_thread();
}

int main() {
while(true) {
a asdf;
create_thread(foo, (void*)&asdf);
}
return 0;
}

析构函数会去哪里?我在哪里必须说删除?或者这是未定义的行为?唯一可能的解决方案是使用 STL 引用计数指针吗?这将如何实现?

谢谢 - 我使用 C++ 有一段时间了,但从来没有遇到过这种情况,我不想造成内存泄漏。

最佳答案

对于堆栈创建的对象,当对象超出范围时会自动调用析构函数。

对于在堆上创建的对象,只有在显式调用delete 时才会释放内存。

无论您是否从函数返回堆栈创建对象的地址都没有关系。当项目超出范围时,仍会调用析构函数。

因此对于您的代码示例:

a * returnnew() 
{
a retval;
return(&retval);
}

a 的析构函数在代码跳回到调用returnnew() 的代码之前被调用。您返回该对象的地址,但该地址指向内存中不再属于您的位置。

Where would i have to say delete?

只有在使用new时才使用delete
如果您使用了 new[]

,则仅使用 delete[]

or is this undefined behavior?

您对不属于您的内存地址所做的操作将是未定义的行为。虽然这不是正确的代码。

Would the only possible solution be to use the STL referenced-counted pointers?

您可以按值返回对象,也可以在堆上创建一个新对象。您也可以通过参数将对象传递给函数,并要求函数更改它。

how would this be implemented?

//Shows how to fill an object's value by reference
void fillA(a& mya)
{
mya.var = 3;
}

//Shows how to return a value on the heap
a* returnNewA()
{
//Caller is responsible for deleting the returned pointer.
return new a();
}

//Shows how to return by value, memory should not be freed, copy will be returned
a returnA()
{
return a();
}

关于c++ - 析构函数如何知道何时激活自己?可以依靠吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596995/

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