对象查杀本身问题

时间:2018-01-11 09:57:45

标签: c++ c++11 vector

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

  1. 动态分配对象
  2. 传递持有此对象的向量或指针
  3. 将对象推送到矢量
  4. 从第1步删除对象
  5. 在向量
  6. 中的对象上调用方法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拥有给定对象的副本。这个想法的重点是根据需要销毁在堆栈上分配的对象。大局是创建对象并将其推送到向量,它是程序中唯一运行的实例。然后,当满足某些条件时,对象将单独决定何时自行销毁。

    我出于好奇而试图这样做,因为它似乎有用(打印信息)我试图先行,然后复制构造函数崩溃的程序。

1 个答案:

答案 0 :(得分:3)

  

强制对象在堆栈上分配时自行终止

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

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

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

void foo()
{
   // ... code   

   { // scope block

       Foo f;

       // ... code

   } // f destroyed

   // ... code
}

但是你需要注意不要因为这样做而损害代码的可读性。

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