You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用指针时疑似存在未知内存泄漏?编译正常但运行报错

问题分析与修复方案

核心运行错误原因

  • 错误释放栈对象:main函数中delete pPt1;是严重错误,pPt1指向的是栈上创建的pt1对象(Point pt1(1, 2);),栈对象由系统自动管理生命周期,不能用delete手动释放,这会直接触发运行时内存错误。

功能未实现问题

  • 未修改静态成员变量:SpyPoint::hack_all_info方法没有按照要求将Point的静态成员numCreatedObjects改为10,当前代码只修改了x和y。

其他潜在问题(非直接运行错误,但建议修复)

  • operator+的参数应改为const Point&,支持常量对象和临时对象的加法操作,避免不必要的限制。
  • operator=的参数应改为const Point&,同时添加自赋值检查,提升代码健壮性。
  • operator<<的参数应改为const Point&,输出操作不会修改对象,符合const正确性原则。
  • 带参数的Point构造函数未对numCreatedObjects计数,析构函数也未减少计数,导致静态成员统计完全错误。

修复后的完整代码

#include <iostream>
using namespace std;
class Point {
private:
    int x;
    int y;
    static int numCreatedObjects;
public:
    Point() : x(0), y(0) {
        numCreatedObjects++;
    }

    Point(int _x, int _y) : x(_x), y(_y) {
        numCreatedObjects++; // 补充分配计数
    }
    ~Point() {
        cout << "Destructed..." << endl;
        numCreatedObjects--; // 析构时减少计数
    }
    void setXY(int _x, int _y) {
        this->x = _x;
        this->y = _y;
    }

    int getX() const { return x; }
    int getY() const { return y; }
    // 修改参数为const引用,成员函数加const
    Point operator+(const Point& pt2) const {
        Point result(this->x + pt2.getX(), this->y + pt2.getY());
        return result;
    }
    // 修改参数为const引用,添加自赋值检查
    Point& operator=(const Point& pt) {
        if (this == &pt) {
            return *this;
        }
        this->x = pt.x;
        this->y = pt.y;
        return *this;
    }
    static int getNumCreatedObject() {
        return numCreatedObjects; 
    }
    friend void print(const Point& pt);
    // 修改参数为const引用
    friend ostream& operator<<(ostream& cout, const Point& pt);
    friend class SpyPoint;
};

// 初始化静态成员
int Point::numCreatedObjects = 0;

void print(const Point& pt) {
    cout << pt.x << ", " << pt.y << endl;
}

// 修改参数为const引用
ostream& operator<<(ostream& cout, const Point& pt) {
    cout << pt.x << ", " << pt.y << endl;
    return cout;
}

class SpyPoint {
public:
    void hack_all_info(Point &pt) {
        pt.x = 40;
        pt.y = 60;
        // 按要求修改静态成员变量为10(静态成员属于类,用类名访问更规范)
        Point::numCreatedObjects = 10;

        cout << "Hacked by SpyPoint" << endl << "x:" << pt.x << endl << "y: " << pt.y << endl;
        cout << "numCreatedObj.: " << Point::numCreatedObjects << endl;
    }
};

int main() {
    Point pt1(1, 2);
    cout << "pt1 : ";
    print(pt1);
    cout << endl;
    Point* pPt1 = &pt1;
    
    cout << "pt1 : ";
    cout << pPt1->getX() << ", " << pPt1->getY() << endl;

    Point* pPt2 = new Point(10, 20);
    cout << endl;
    cout << "pt2 : ";
    cout << pPt2->getX() << ", " << pPt2->getY() << endl;
    cout << endl;
    // 移除错误的栈对象delete操作
    delete pPt2;
    cout << "NumCreatedObject : ";
    cout <<  Point::getNumCreatedObject() << endl;

    Point pt2(10, 20);
    Point pt3(30, 40);
    Point pt4 = pt2 + pt3;
    cout << "NumCreatedObject : ";
    cout << Point::getNumCreatedObject() << endl << endl;
    // 对象数组
    Point* ptAry = new Point[5];
    cout << "NumCreatedObject : ";
    cout << Point::getNumCreatedObject() << endl;
    cout << endl;

    delete[] ptAry;
    cout << endl;
    // 友元类测试
    SpyPoint spy;
    cout << "pt1 info" << endl;
    spy.hack_all_info(pt1);
    cout << "pt4 info" << endl;
    spy.hack_all_info(pt4);
    return 0;
}

修复说明

  1. 移除delete pPt1;:栈对象由系统自动销毁,手动delete会触发内存访问错误。
  2. 完善静态成员计数:带参数构造函数补充分配计数,析构函数减少计数,确保numCreatedObjects统计准确。
  3. 实现静态成员修改:在hack_all_info中通过Point::numCreatedObjects = 10;完成要求的修改,静态成员属于类而非对象,用类名访问更规范。
  4. const正确性修复:修改运算符重载的参数为const引用,成员函数添加const修饰,符合C++编码规范,提升代码兼容性。

内容的提问来源于stack exchange,提问作者Jeongbokja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:49:52