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

时间:2020-02-10 11:06:52

标签: c++ class memory-management destructor definition

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

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

4 个答案:

答案 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地址的双重释放

相关问题