繁体   English   中英

C ++在一个函数中分配动态内存并清除另一个函数

[英]C++ allocating dynamic memory in one function and clearing another function

我希望专家们对以下动态内存分配过程进行回顾,并建议是否存在任何内存泄漏。 后面的代码不是使用中的真实代码,而是尝试以不同的方式理解内存分配和取消分配的概念。

class ObjMapData
{
private:
int* itsMapData;
........
public:
ObjMapData();
~ObjMapData(){if(itsMapData!= NULL) delete[] itsMapData;}
ClearMemory() {if(itsMapData!= NULL) {delete[] itsMapData; itsMapData= NULL}}
.......
void SetMapData(int* ptrData) { itsMapData = ptrData;} // or should I use int*&ptrData??
int* GetMapData() const { return itsMapData;}
}

现在,我可以执行以下操作而不会发生任何内存泄漏吗?

bool Function1(ObjMapData& objMyMap)
{
//populate the ptrData with some data values using many different ways
int* ptrData = new int[1000]; // usually a variable from binary file header

......................
objMyMap.SetMapData(ptrData);
//don't want to delete the memory yet
return true;
}

bool Function2(ObjMapData& objMyMap)
{
int* ptrData = objMyMap.GetMapData();
//do some work such as writing updated data into a binary file
}

bool Function3(ObjMapData& objMyMap)
{
//populate the data
bool bStatus = Function1(objMyMap);

int* ptrData = objMyMap.GetMapData();
//update the map data using ptrData variable
..........
bStatus = Function2(objMyMap); // write data to a binary file
objMyMap.ClearMemory(); // not real code  in use, but for understanding the concept
bStatus = Function1(objMyMap); // re-allocate memory
ptrData = objMyMap.GetMapData();
//update the map data using ptrData variable
objMyMap.SetMapData(ptrData); // Do I need to set again or member pointer get updated automatically?
return true
}
int main()
{
ObjMapData objMyMap;
bool bStatus = Function3(objMyMap);
//default destructor of objMyMap can take care of the allocated memory cleanup
return 0;
}

感谢您抽出宝贵的时间来确认动态内存分配。

尽管这似乎与样式有关,而不是与您有关内存泄漏的问题有关,但是我将在类中私下处理数据:

class ObjMapData
{
private:
int* itsMapData;
// consider adding 'datasize' member variable   
........
public:
ObjMapData(){ itsMapData=NULL; }; // initialise member variable(s)!
~ObjMapData(){ delete[] itsMapData;}
ClearMemory() { delete[] itsMapData; itsMapData=NULL; }
.......
void CreateMapData(int size) { ClearMemory(); itsMapData= new int[size]; }
void FillDataFrom( ???? ) { ???? };
int* GetMapData() const { return itsMapData;}
}

然后,您可以更好地通过增加拷贝构造函数和分配方法,这防止内存泄漏,当您使用类改善类。

编辑你问:

我关心的是以下哪一项是正确的:void SetMapData(int * ptrData)与void SetMapData(int *&ptrData)

两者都允许在类中复制和使用外部(指向该类的)指针,这是“正确的”-就“内存泄漏”而言,这取决于您要管理代码的哪一部分分配。 你可以:

  1. 有一个类在内部处理分配/取消分配
  2. 分配内存,使用某个类来操纵它,在类外释放内存
  3. 让一个类分配内存,然后再在该类之外取消分配
  4. 分配内存,并有一些类来操纵和释放它。

通常,我发现1和2比3或4更有意义。例如,它更容易跟踪正在发生的事情,不太可能隐藏错误等等。

但是,就“泄漏内存”而言:指向已分配内存块的指针在哪里,如何复制,分配或引用它都无关紧要-重要的是作为内存地址的值。 因此,只要您正确地newdelete该内存地址,您就不会泄漏内存(无论这些动作是否在类内)。

如果在您的应用程序中需要在类外部分配/取消分配int数组,则对于成员函数引用该指针确实有意义,这是向读者暗示该类不负责其分配的提示-但有些体面的评论无论如何应该使这一点很清楚:

多年以来,由于分配内存的“所有权传递”处理不当(由于使用了良好的ol'C'格式),我遇到了许多错误。在编写某些代码的前提下,它们假定必须释放一个封锁,否则其他人会这样做。

这是回答您的问题还是我错过了要点?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM