#include <iostream>
class Point {
private:
int* x; int y;
public:
Point(int x1, int y1) {
int* x = new int;
*x = x1 ;
y = y1;
}
int* getX() { return x; }
void setX(int* p) { x = p; }
int getY() { return y; }
};
int main()
{
Point* p1 = new Point(10, 15);
Point* p2 = new Point(20, 25);
p2->setX(p1->getX());
std::cout << "p1.x = " << p1->getX() << ", p1.y = " << p1->getY() << std::endl;
std::cout << "p2.x = " << p2->getX() << ", p2.y = " << p2->getY() << std::endl;
delete p1;
delete p2;
return 0;
}
构造函数中的分配空间有什么问题?
答案 0 :(得分:2)
您要重新声明本地名称。
代替
int* x = new int;
做
x = new int;
答案 1 :(得分:2)
这里是经过修改的有效代码。
#include <iostream>
using namespace std;
class Point {
private:
int* x; int y;
public:
Point(int x1, int y1) {
x = new int;
*x = x1 ;
y = y1;
}
int* getX() { return x; }
void setX(int* p) { x = p; }
int getY() { return y; }
};
int main()
{
Point* p1 = new Point(10, 15);
Point* p2 = new Point(20, 25);
p2->setX(p1->getX());
std::cout << "p1.x = " << *p1->getX() << ", p1.y = " << p1->getY() << std::endl;
std::cout << "p2.x = " << *p2->getX() << ", p2.y = " << p2->getY() << std::endl;
delete p1;
delete p2;
return 0;
}
p1.x = 10, p1.y = 15
p2.x = 10, p2.y = 25
这是您所期望的
答案 2 :(得分:2)
代码中有几个缺点。
对于此构造函数中的初学者而言
Point(int x1, int y1) {
int* x = new int;
*x = x1 ;
y = y1;
}
数据成员x未初始化。构造函数处理在构造函数的主体中声明的局部变量x
int* x = new int;
您可以像这样编写构造函数
Point( int x1, int y1 ) : x( new int( x1 ) ), y( y1 ) {}
函数setX
应该对传递的指针进行深层复制,并释放已经分配给存储在数据成员x中的内存指针。
void setX(int * p){删除x; x =新的int(* p); }
此外,您至少需要一个析构函数。否则,指针x指向的内存将不会被删除。
~Point() { delete x; }
此外,还希望定义副本分配运算符和副本构造函数。
答案 3 :(得分:0)
您的程序存在内存泄漏,因为“新int”必须为自由状态。但是最大的错误是您这样做时:
p2->setX(p1->getX());
您覆盖了P2.x的地址,由于丢失了其原始地址,因此将不再能够释放它。
即使您delete P2->x
也会导致P1.x
地址的双重释放