gpt4 book ai didi

c++ - 对象杀死自身问题

转载 作者:行者123 更新时间:2023-11-27 23:49:00 29 4
gpt4 key购买 nike

我一直在尝试想出一个想法来强制对象在堆栈上分配时杀死自己。步骤如下:

  1. 动态分配对象
  2. 传递持有该对象的 vector 的引用或指针
  3. 将对象插入 vector
  4. 从步骤 1 中删除对象
  5. 在 vector 中的对象上调用方法destroySelf

代码示例:

class Foo
{
std::vector<Foo> *ownVector;
public:
Foo(std::vector<Foo> *ownVector) : ownVector(ownVector)
{
std::cout<<"Foo ctor"<<std::endl;
}
bool operator==(A const &b){ return true; }
bool removeItself()
{
std::vector<Foo>::iterator iter = std::find(ownVector->begin(), ownVector->end(), *this);
if(iter != ownVector->end())
{
ownVector->erase(iter);
return true;
}
return false;
}
~Foo()
{
std::cout<<"Foo dtor"<<std::endl;
}
}
int main()
{
std::cout << "Hello world!" << std::endl;
std::cout << "Vector created:" <<std::endl;
std::vector<Foo> fooVector;
std::cout << "Foo obj created on heap:" <<std::endl;
Foo *foo = new Foo(&fooVector);
std::cout << "Foo object pushed to vector:" <<std::endl;
fooVector.push_back(*foo);
std::cout << "Foo object dealocated from heap:" <<std::endl;
delete foo;
std::cout << "Call removeItself:" <<std::endl;
fooVector.at(0).removeItself();
std::cout<<"Main end";
return 0;
}

结果如下:

Hello world!  
Vector created:
Foo obj created on heap:
Foo -ctor
Foo object pushed to vector:
Foo object dealocated from heap:
Foo -dtor
Call removeItself:
Foo -dtor
Main end

第一个问题:这样实现的风险是什么?

第二个问题:当我尝试实现拷贝构造函数时

Foo(Foo const &foo){ std::cout<<"Foo cpyctor"<<std::endl; }

它在调用 removeItself 时开始崩溃。这是为什么?

回答问题:我知道 vector 拥有给定对象的拷贝。这个想法的全部意义在于按需销毁位于堆栈 上的对象。大局是对象被创建并推送到 vector ,它是程序中唯一运行的实例。然后,当满足某些条件时,对象将自行决定何时销毁自身。

出于好奇,我尝试这样做,因为它似乎有效(打印消息),我尝试继续前进,然后复制构造函数崩溃的程序。

最佳答案

to force object to kill itself while it is allocated on stack

据此,我假设您的意思是在正常生命周期结束之前显式销毁(并为其释放空间)具有自动存储持续时间的对象。这无法完成。您只能显式控制动态存储持续时间 的对象(即由new 创建的对象)的生命周期。所有其他对象(自动、静态和线程存储持续时间)的生命周期由其他规则管理(分别为范围结束、程序结束和线程结束)。不能以任何方式规避这些规则。

所以简而言之,如果您需要手动销毁一个对象,您需要使该对象具有动态存储持续时间。

或者,根据您的用例,您可以创建一个范围来控制销毁点。例如:

void foo()
{
// ... code

{ // scope block

Foo f;

// ... code

} // f destroyed

// ... code
}

但是您需要注意不要这样做会损害代码的可读性。

如果这是一个学术练习(例如纯粹的好奇心),那么以上就是解决方案。但是,如果您在尝试解决某些问题时遇到此问题,那么您的问题是 XY problem .

关于c++ - 对象杀死自身问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48204195/

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