需要以下代码的帮助,下面的代码有什么问题


#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;
}

构造函数中的分配空间有什么问题?

您正在重新声明本地。

而不是

int* x = new int;

x = new int;

代码中有几个缺点。

对于此构造函数中的初学者

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( { delete x; x = new int( *p (; }

此外,您至少需要一个析构函数。否则,指针 x 指向的内存将不会被删除。

~Point() { delete x; }

此外,还需要定义复制赋值运算符和复制构造函数。

这是几乎没有修改的工作代码。

#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                                                                                                                                                               

这是你期待的吗

你的程序有内存泄漏,因为"new int"必须是空闲的。但最大的错误是,当你这样做时:

p2->setX(p1->getX());

您覆盖了 P2.x 的地址,您将无法再释放它,因为您已经丢失了它的原始地址。

即使你delete P2->x也会导致P1.x地址的双重释放

最新更新