在C++中动态分配向量的安全方法是什么?

tru*_*ian 2 c++ vector dynamic-allocation

在动态分配struct之后,我认为在最后添加'delete'是谨慎的.但它给了我一个运行时错误.虽然编译好了.因此,如果我摆脱'删除',它运行正常.但我担心可能会有内存泄漏.处理此代码的安全方法是什么?

#include <iostream>
#include <vector>
using namespace std;

typedef struct
{
    vector<char*> vstr;
    vector<int> vint;

}VecStrInt;

int main()
{
    VecStrInt * mtx = new VecStrInt();

    mtx[0].vstr.push_back("Hello");
    mtx[0].vint.push_back(1);

    cout<<mtx[0].vint.at(0)<<endl;
    cout<<mtx[0].vstr.at(0)<<endl;

    //delete [] mtx;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

呼叫delete[]与呼叫不同delete(注意方括号).

你可以delete通过电话new和电话来delete[]调用电话new SomeType[someCount].

在您的情况下,您分配了一个对象,而不是一个数组.你的对象碰巧代表一个向量,它是一个数组,但它与C++没关系:你用"single"分配它new,所以你不能delete[]对它应用"数组" .

因此,您需要delete使用常规删除操作符:

delete mtx;
Run Code Online (Sandbox Code Playgroud)

注意:您应该std::vector<T>动态分配的情况很少.代表std::vector<T>自身的对象非常小; 数据存储在其他地方,并动态分配.所以你不妨使用

VecStrInt mtx;
Run Code Online (Sandbox Code Playgroud)

delete完全跳过.