我在这里正确使用删除吗?

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中的删除是否必要?一切看起来都很笨拙吗?

Mar*_*ork 5

有几个问题:

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)