我一直试图想出一个强制对象在堆栈上分配时自杀的想法。步骤如下:
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拥有给定对象的副本。这个想法的重点是根据需要销毁在堆栈上分配的对象。大局是创建对象并将其推送到向量,它是程序中唯一运行的实例。然后,当满足某些条件时,对象将单独决定何时自行销毁。
我出于好奇而试图这样做,因为它似乎有用(打印信息)我试图先行,然后复制构造函数崩溃的程序。
答案 0 :(得分:3)
强制对象在堆栈上分配时自行终止
由此我假设你的意思是在正常生命周期结束之前用自动存储持续时间显式地销毁(和释放空间)一个对象。 无法完成。您可以仅显式控制动态存储持续时间的对象的生命周期(即new
创建的对象)。所有其他对象(自动,静态和线程存储持续时间)的生命周期由其他规则(范围结束,程序结束和线程结束)管理。这些规则不能以任何方式规避。
因此,简而言之,如果您需要手动销毁对象,则需要使该对象具有动态存储持续时间。
或者,根据您的使用案例,您可以创建一个范围来控制销毁点。 E.g:
void foo()
{
// ... code
{ // scope block
Foo f;
// ... code
} // f destroyed
// ... code
}
但是你需要注意不要因为这样做而损害代码的可读性。
如果这是一次学术练习(例如纯粹的好奇心),那么以上就是解决方案。但是,如果您在尝试解决某些问题时遇到此问题,那么您的问题是XY problem。