Ste*_*ano 1 c++ memory-management class delete-operator
我刚刚开始结合我对C++类和动态数组的了解.我得到了"任何时候我使用新运算符"的建议我应该删除.我也知道析构函数是如何工作的,所以我认为这段代码是正确的:
main.cpp中
...
int main()
{
PicLib *lib = new PicLib;
beginStorage(lib);
return 0;
}
void beginStorage(PicLib *lib)
{
...
if (command != 'q')
{
//let's assume I add a whole bunch
//of stuff to PicLib and have some fun here
beginStorage(lib);
}
else
{
delete lib;
lib = NULL;
cout << "Ciao" << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
PicLib.cpp
...
PicLib::PicLib()
{
database = new Pic[MAX_DATABASE];
num_pics = 0;
}
PicLib::~PicLib()
{
delete[] database;
database = NULL;
num_pics = 0;
}
...
Run Code Online (Sandbox Code Playgroud)
我用一个Pic包含更多动态数组的类填充我的PicLib .Pic析构函数以与上面相同的方式删除它们.我认为delete [] database正确地摆脱了所有这些课程.
那么main.cpp中的删除是否必要?一切看起来都很笨拙吗?
有几个问题:
int main()
{
PicLib *lib = new PicLib;
beginStorage(lib);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最好在同一范围内分配和删除内存,以便于查找.
但在这种情况下,只需在本地声明它(并通过引用传递):
int main()
{
PicLib lib;
beginStorage(lib);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在beginStorage()中
但我认为没有理由操纵指针.通过引用传递它,并在本地使用它.
void beginStorage(PicLib& lib)
{
....
}
Run Code Online (Sandbox Code Playgroud)
在PicLib类中,您有一个RAW指针:数据库.
如果您拥有一个RAW指针(您创建并销毁它),则必须覆盖复制构造函数和赋值运算符的编译器生成版本.但在这种情况下,我认为没有理由使用指针,只使用向量会更容易:
class PivLib
{
private:
std::vector<Pic> databases;
};
Run Code Online (Sandbox Code Playgroud)