【问题标题】:Need help on the below code , what is the problem with the Below Code [closed]在下面的代码上需要帮助,下面的代码有什么问题[关闭]
【发布时间】:2020-05-25 16:38:51
【问题描述】:
#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;
}

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

【问题讨论】:

  • 我无法打印 POINT X 值
  • 代码没有解释它应该做什么只是做了它所做的。我们怎么知道你还期望它做什么?
  • 请刷新How to Ask,以及this question checklist
  • @user3865070 您正在两个points 中打印x 变量的地址。您的意思是打印 *p1-&gt;getX() 吗? (这可能会使您的代码崩溃,如下面的回答中所述)
  • 顺便说一句,如果你无缘无故停止使用指针,你的大部分问题都会消失

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


【解决方案1】:

您正在重新声明本地。

而不是

int* x = new int;

x = new int;

【讨论】:

    【解决方案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                                                                                                                                                               
    
    

    这是你所期待的

    【讨论】:

    • x = new int;应该在某处释放此内存。
    【解决方案3】:

    代码中有几个缺点。

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-03-12
        • 1970-01-01
        • 2018-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多