使用指针时疑似存在未知内存泄漏?编译正常但运行报错
问题分析与修复方案
核心运行错误原因
- 错误释放栈对象:
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; }
修复说明
- 移除
delete pPt1;:栈对象由系统自动销毁,手动delete会触发内存访问错误。 - 完善静态成员计数:带参数构造函数补充分配计数,析构函数减少计数,确保
numCreatedObjects统计准确。 - 实现静态成员修改:在
hack_all_info中通过Point::numCreatedObjects = 10;完成要求的修改,静态成员属于类而非对象,用类名访问更规范。 - const正确性修复:修改运算符重载的参数为const引用,成员函数添加const修饰,符合C++编码规范,提升代码兼容性。
内容的提问来源于stack exchange,提问作者Jeongbokja
相关产品推荐
相关产品推荐

