【问题标题】:vector pushback calling destructor on calling a function向量 push_back 在调用函数时调用析构函数
【发布时间】:2019-03-22 17:58:55
【问题描述】:

我有一个结构

struct Point
{

    int x,y;
    Point(int _x,int _y)
    {
    x=_x,y=_y;
    }
    int GetX()
    {
    return x;
    }
    int GetY()
    {
    return y;
    }

}

如果我打电话在我的程序中

Point *ptr=new Point(5,10);
vector<Point>allpts;
allpts.push_back(Point(ptr->GetX(),ptr->GetY());

这一行之后

ptr 在不应该被推回后被删除。

为什么会这样?

【问题讨论】:

  • ptr is getting deleted after push back when it should not. 什么?你怎么知道的?
  • 为什么使用new动态分配Point?你接触过 Java 吗?

标签: c++ vector destructor


【解决方案1】:

在您的示例中,使用仅使用参数副本初始化所有数据成员的构造函数是没有意义的。当数据成员公开时,吸气剂也没有价值。提出您的要求唯一感兴趣的事情

ptr 在不应该被推回后被删除。

observable 是一个析构函数,它告诉您正在销毁的对象,但您的示例中缺少该析构函数。效果相同的代码:

#include <vector>
#include <iostream>

struct Point
{
    int x, y;
    ~Point() { std::cout << "Point dtor called for " << this << '\n'; }
};

int main()
{
    Point *ptr = new Point{ 5, 10 };
    std::cout << "ptr points to " << ptr << '\n';

    std::vector<Point>allpts;
    allpts.push_back(*ptr);

    // delete ptr;
}

示例输出(不含delete ptr;):

ptr points to 0018DE58
Point dtor called for 0018DBF0

示例输出(带有delete ptr;):

ptr points to 0018DE58
Point dtor called for 0018DBF0
Point dtor called for 0018DE58

如您所见,ptr 指向的对象不会被删除,除非明确删除。

【讨论】:

    猜你喜欢
    • 2019-07-04
    • 2014-03-14
    • 2018-02-21
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多