C++ 释放结构向量内存的正确方法

C++ 释放结构向量内存的正确方法,c++,memory,stdvector,C++,Memory,Stdvector,释放struct的std::vector内存的正确方法是什么 考虑以下伪代码: typedef struct { unsigned int packageLen; unsigned char* package; } PACKAGE; std::vector<PACKAGE*>* packages = new std::vector<PACKAGE*>; for (...) { PACKAGE *tempPackage = new PACKAGE;

释放
struct
std::vector
内存的正确方法是什么

考虑以下伪代码:

typedef struct
{
   unsigned int packageLen;
   unsigned char* package;
} PACKAGE;

std::vector<PACKAGE*>* packages = new std::vector<PACKAGE*>;

for (...)
{
   PACKAGE *tempPackage = new PACKAGE;
   // Set data of package
   packages->pushback(tempPackage);
}

// Function exit
if (packages)
   delete packages;
typedef结构
{
无符号整数包;
未签名字符*包;
}包装;
std::vector*包=新的std::vector;
对于(…)
{
PACKAGE*tempPackage=新软件包;
//包的设置数据
包装->推送(临时包装);
}
//函数出口
如果(包)
删除软件包;
这会正确地释放分配的内存吗

这会正确地释放分配的内存吗

它将正确地释放向量的内存

它将无法正确释放指针存储在向量中的
对象的内存。除非这些指针被复制到其他地方,否则这将是内存泄漏

此外,
如果(包)
检查是多余的


几乎没有一个很好的理由动态分配一个向量。而且几乎没有一个好的理由使用拥有裸指针。尽量避免这些。

经验法则:您需要为每个
新的
删除

在您的示例中,您使用
new
分配了向量对象,并使用
delete
将其删除。这是正确的。但您也在循环中创建了许多包,并且没有删除它们。为了让C++为您做,您必须为<代码> STD::vector < /COD>编写自己的分配器对象,或者在删除该向量之前,循环它并删除其项:

for (auto &ptr : packages) delete ptr;
delete packages;
packages = nullptr;
还要注意,我正在将包指针设置为
nullptr
。当您使用
delete
时,这种情况不会自行发生。虽然nullptr上的delete是独立且安全的,但对已经删除的指针调用delete会导致程序崩溃(考虑到最后的条件,您很清楚这一点)


<*>*注:**aseReRoKa表示,通常没有理由动态分配<代码> STD::vector < /C> >,在现代C++中,智能指针通常是首选的(<代码> STD: UNIQUYPPTR < /C>和 STD::SyrdYPPTR )。< /P> < P>不,您正在泄漏内存。这是一条正确的道路

struct包
{
// ...
};
int main()
{
std::vector包;//不涉及指针
//如果您知道有多少,此时可以使用vector::reserve
//您将需要的元素
对于(…)
{
packages.push_back({/*…*/});//还可以添加构造函数并调用emplace_back
//根据需要使用packages.back()或其他元素
}
//不需要释放任何东西
}
当然,您可以根据您的具体情况改进此代码。例如,如果您确切地知道要默认初始化多少个元素,您可以在构造函数中创建它们

这会正确地释放分配的内存吗

不,您正在泄漏所有的
实例,可能还有所有的
char[]
实例。这种代码中根本不应该有
new
delete

struct包
{
字符串包;
};
std::向量包;
对于(…)
{
包装和包装;
//包的设置数据
包装。向后推(临时包装);
}
//函数出口

否,使用智能指针否,当然不是。向量仅正确释放其元素。因此,指针本身(=地址值)会被删除,但它们指向的对象不会被删除。不要将原始指针用于所有权。考虑不要使用指针:<代码> STD::向量< /代码>。为什么释放结构内存是“正确的”?可能还有其他指针仍然引用它,而且它们不应该因为删除了一个容器而失效。您几乎不想动态分配一个标准容器。他们已经在动态地管理内存了。@idclev463035818除了
std::array
经验法则是一个很好的方法。但是自从C++11以来,更好的方法是“不要使用
new
”…@DevSolar。但我知道一些使用C++11/14的大公司,在那里没有人使用智能指针,他们要么自己管理内存,要么求助于垃圾收集库。我认为OP问题很好,因为最好为这种情况做好准备,而不是完全了解智能指针,没有它们就无法正确清理。你可能应该
std::move(tempPackage)
?@AyxanHaqverdili可能,或者最好找一个合适的构造器,然后
emplace\u back
谢谢你的帮助。不幸的是,由于其他限制,我无法使用
std::string
。谢谢您的帮助。我选择这个解决方案是因为一些项目要求和限制。不过,我们一定会研究智能指针以备将来使用。谢谢@eerorika的帮助。你介意告诉我为什么if(package
是多余的吗?据我所知,删除一个不存在的项目会导致错误?@0x436f72647265删除空指针是安全的。它不会导致任何问题
struct Package
{
    std::string package;
};

std::vector<Package> packages;

for (...)
{
   Package tempPackage;
   // Set data of package
   packages.push_back(tempPackage);
}

// Function exit