构造函数初始化二维指针失败,调试显示0xcccccccc?求排查
问题诊断:局部变量遮蔽类成员变量导致的野指针问题
你遇到的0xcccccccc是Visual Studio环境下用来标记未初始化堆内存的特殊值,根源出在你的构造函数里——你不小心定义了一个和成员变量同名的局部变量,把类的成员变量给“遮蔽”了!
具体问题点
在Asset的构造函数中,你写了:
double **_assetReturn = new double*[_numberAssets];
这里的double **是在重新声明一个局部变量,它和类的成员变量_assetReturn重名。这就意味着:
- 你分配的内存都给了这个局部的
_assetReturn,而类的成员变量完全没被初始化 - 当构造函数执行完毕,局部变量被销毁,成员变量依然是未初始化状态,所以在
main里调用getAssetReturnMatrix()时,返回的是一个野指针,也就是你看到的0xcccccccc
修正方案
去掉构造函数里的局部变量声明,直接给类的成员变量赋值:
Asset::Asset(int numberAssets, int numberReturns) { _numberAssets = numberAssets; _numberReturns = numberReturns; // 直接给成员变量分配内存,不要重新声明 _assetReturn = new double*[_numberAssets]; for (int i = 0; i < _numberAssets; i++) { _assetReturn[i] = new double[_numberReturns]; } }补充析构函数避免内存泄漏:
原来的空析构函数会导致你分配的二维数组内存无法释放,必须手动回收:Asset::~Asset() { // 先释放每一行的内存 for (int i = 0; i < _numberAssets; i++) { delete[] _assetReturn[i]; } // 再释放行指针数组的内存 delete[] _assetReturn; }确保getter方法正确返回成员变量:
补充getAssetReturnMatrix()的实现,确保返回类的成员变量:double **Asset::getAssetReturnMatrix() { return _assetReturn; }
修正后的完整代码示例
Asset.h
class Asset { public: Asset(int numberAssets, int numberReturns); // Constructor // getter and setter double **getAssetReturnMatrix(); ~Asset(); private: int _numberAssets, _numberReturns; double **_assetReturn; };
Asset.cpp
#include "Asset.h" Asset::Asset(int numberAssets, int numberReturns) { _numberAssets = numberAssets; _numberReturns = numberReturns; // 直接给成员变量分配内存 _assetReturn = new double*[_numberAssets]; for (int i = 0; i < _numberAssets; i++) { _assetReturn[i] = new double[_numberReturns]; } } double **Asset::getAssetReturnMatrix() { return _assetReturn; } Asset::~Asset() { // 释放二维数组内存 for (int i = 0; i < _numberAssets; i++) { delete[] _assetReturn[i]; } delete[] _assetReturn; }
Main.cpp
#include <iostream> #include "Asset.h" using namespace std; int main(int argc, char *argv[]) { int numberAssets = 83; int numberReturns = 700; Asset returnMatrix(numberAssets, numberReturns); double ** data = returnMatrix.getAssetReturnMatrix(); cout << data << endl; // 现在会输出有效的内存地址 // readData(data, fileName); return 0; }
这样修改后,getAssetReturnMatrix()就能正确返回你分配的二维数组指针了,不会再出现0xcccccccc的野指针问题。
内容的提问来源于stack exchange,提问作者Ary
相关产品推荐
相关产品推荐

