C++ C++;具有可变长度项的向量的内存管理

C++ C++;具有可变长度项的向量的内存管理,c++,memory-management,vector,struct,C++,Memory Management,Vector,Struct,以可变长度结构为例(如果这是一个真实的程序,则使用int数组更好): 以上内容适用于ubuntu中的g++。需要使用new()调用来避免segfaults。当不再需要lst向量时,是否可以一次将其全部删除,或者新调用是否会导致内存泄漏?手动删除()使用new()调用的所有部分将是一件乏味的事情。通常,您需要将清理代码放入对象的析构函数(~list\u of_numbers())中,并将内存创建代码放入构造函数(list\u of_numbers())。这样,当调用析构函数(或创建对象)时,这些事

以可变长度结构为例(如果这是一个真实的程序,则使用int数组更好):


以上内容适用于ubuntu中的g++。需要使用new()调用来避免segfaults。当不再需要lst向量时,是否可以一次将其全部删除,或者新调用是否会导致内存泄漏?手动删除()使用new()调用的所有部分将是一件乏味的事情。

通常,您需要将清理代码放入对象的析构函数(
~list\u of_numbers()
)中,并将内存创建代码放入构造函数(
list\u of_numbers()
)。这样,当调用析构函数(或创建对象)时,这些事情就会为您处理

通常,您希望将清理代码放入对象的析构函数(
~list\u of \u numbers()
)中,并将内存创建代码放入构造函数(
list\u of \u numbers()
)。这样,当调用析构函数(或创建对象)时,这些事情就会为您处理

> P> > C++中的典型方法是定义构造函数、析构函数和赋值运算符,以处理内存管理的ListyOf>代码/>结构,或者(更好)使用<代码> STD::vector < /COD> > <代码>编号<代码>字段,并去掉<代码>长度字段.< /P> 但如果您这样做,您也可以完全摆脱struct,只需执行以下操作:

#include <vector>
typedef std::vector<int> list_ints;
typedef std::vector<int_ints> list_lists;

(...)

list_lists lst(10); // make 10 lists.
lst[0].resize(7);   // set length of the zeroth list to 7
#包括
typedef std::向量列表;
typedef std::向量列表\u列表;
(...)
列表_列表lst(10);//列出10张清单。
lst[0]。调整大小(7);//将第0个列表的长度设置为7

在C++中这样做的典型方式是定义用于管理内存管理的<代码> ListSoFixNo.<代码> Stutt的构造函数和析构函数和赋值运算符,或者(更好)使用<代码> STD::vector < /COD> > <代码>编号<代码>字段,并去掉<代码>长度Field.< /P> 但如果您这样做,您也可以完全摆脱struct,只需执行以下操作:

#include <vector>
typedef std::vector<int> list_ints;
typedef std::vector<int_ints> list_lists;

(...)

list_lists lst(10); // make 10 lists.
lst[0].resize(7);   // set length of the zeroth list to 7
#包括
typedef std::向量列表;
typedef std::向量列表\u列表;
(...)
列表_列表lst(10);//列出10张清单。
lst[0]。调整大小(7);//将第0个列表的长度设置为7

为什么不使用int向量呢?这就是我的工作。您不应该在专用类之外调用new。

为什么不使用int向量呢?这就是我的工作。您不应该在专用类之外调用new。

您还必须实现复制构造函数和复制赋值运算符。@DeadMG:如果它不可复制,您就不能将它的实例放在向量:-)中。我喜欢这个答案。事实上,它说到点子上了。你会读到我说的:“(如果这是一个真正的程序,int数组会更好)”。这实际上是预期的答案。@James McNellis:取决于您是否使用C++0x。@DeadMG:好的,因此如果您有移动感知容器库实现,您需要实现复制构造函数和复制赋值运算符,或者移动构造函数和移动赋值运算符。由于隐式声明的特殊成员函数无法完成我们需要它们完成的任务,因此您仍然必须执行某些操作。您还必须实现复制构造函数和复制赋值运算符。@DeadMG:如果它不可复制,您就不能将其实例放在向量:-)中。我喜欢这个答案。事实上,它说到点子上了。你会读到我说的:“(如果这是一个真正的程序,int数组会更好)”。这实际上是预期的答案。@James McNellis:取决于您是否使用C++0x。@DeadMG:好的,因此如果您有移动感知容器库实现,您需要实现复制构造函数和复制赋值运算符,或者移动构造函数和移动赋值运算符。由于隐式声明的特殊成员函数无法执行我们需要它们执行的操作,因此您仍然必须执行某些操作。小代码输入类型定义std::vector list_list;->typedef std::向量列表\u列表;小代码输入类型定义标准::向量列表\u列表;->typedef std::向量列表\u列表;
#include <vector>
typedef std::vector<int> list_ints;
typedef std::vector<int_ints> list_lists;

(...)

list_lists lst(10); // make 10 lists.
lst[0].resize(7);   // set length of the zeroth list to 7