【发布时间】:2021-09-23 04:56:06
【问题描述】:
这里,当我压栈时,为什么对象被销毁了?
#include <iostream>
#include <stack>
class One
{
private:
int i;
public:
One(int i) {this->i = i;}
~One() {std::cout << "value " << this->i << " is destroyed\n";}
};
int main()
{
std::stack<One> stack;
stack.push(One(1));
stack.push(One(2));
std::cout << "Now I'll stop\n";
}
我预计在Now I'll stop 之前看不到任何输出。但我明白了
value 1 is destroyed
value 2 is destroyed
Now I'll stop
value 1 is destroyed
value 2 is destroyed
如果我想阻止它们破坏,我应该怎么做?
【问题讨论】:
-
One(1)创建一个复制的临时对象。一旦被复制并且push函数返回临时对象不再需要并且它的生命周期结束并被破坏。 -
看到标记的重复项中没有表示赞成的答案,我认为这个 Q 不应该作为重复项关闭
-
std::vector 是否使用 push_back 复制对象?部分回答了我的问题。 @JHBonarius 我实际上想做一些复杂的事情,比如在类中存储指针。如果我在
int *ip;类中多了一个属性,并将构造函数和析构函数修改为One(int i) {this->i = i; this->ip = new int(i); }~One() {std::cout << "value " << this->i << " is destroyed\n"; free(this->ip);},我就有了double free的问题。 -
通过
new创建的@Sayan对象必须由delete释放,free仅属于malloc.calloc,realloc
标签: c++ temporary-objects