У меня есть структура
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 удаляется после возврата, хотя этого не должно быть.
почему это происходит?
Почему вы выделяете Point
динамически с помощью new
? Вы когда-нибудь касались Java?
Нет смысла иметь конструктор, который только инициализирует все члены данных копиями параметров в вашем примере. Также геттеры не заслуживают внимания, когда члены данных являются общедоступными. Единственное, что было бы интересно сделать вашу претензию
ptr is getting deleted after push back when it should not.
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
, на который указывает, не удаляется, если это не сделано явно.
ptr is getting deleted after push back when it should not.
Что? Откуда вы знаете?