Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带数组的ptr_向量:我能确定它的析构函数调用delete[]而不是delete吗?_C++_Memory Management_Boost - Fatal编程技术网

C++ 带数组的ptr_向量:我能确定它的析构函数调用delete[]而不是delete吗?

C++ 带数组的ptr_向量:我能确定它的析构函数调用delete[]而不是delete吗?,c++,memory-management,boost,C++,Memory Management,Boost,我有以下情况: boost::ptr_vector<float> vec; float* array = new float[4](); vec.push_back(array); // Add some more elements to vec.. boost::ptr_向量向量向量; 浮点*数组=新浮点[4](); 向量推回(数组); //向vec添加更多元素。。 我如何确保如果我离开此作用域,vec将被销毁,ptr_向量的析构函数调用delete[]而不是delete对

我有以下情况:

boost::ptr_vector<float> vec;

float* array = new float[4]();
vec.push_back(array);

// Add some more elements to vec..
boost::ptr_向量向量向量;
浮点*数组=新浮点[4]();
向量推回(数组);
//向vec添加更多元素。。

我如何确保如果我离开此作用域,vec将被销毁,ptr_向量的析构函数调用
delete[]
而不是
delete
vec
的每个元素进行调用。我不明白它应该如何工作,因为模板参数float对于
float*
float[4]

对于包含内置简单类型项(如float或char)的数组是相同的:我认为delete和delete[]之间没有区别,因为delete[]假设调用了许多析构函数-对于数组的每个对象,但内置基元类型不假设调用析构函数-那里没有要销毁的内容;释放浮点数组就是释放内存的一部分,而不执行任何可能放在某种析构函数中的代码。Murr…

您可以将
ptr\u vector
CloneAllocator
模板参数指定为非默认的
堆克隆分配器。没有办法创建实际类的实例
boost::ptr_vector
使用
delete[]
而不是
delete

如果您可以使用它,
std::vector
就可以了。是的,我知道这一点。但另一个分配器(如view_clone_分配器)只是不执行释放。但是,我能做些什么来获得像ptr_向量这样的功能,该向量使用delete[]删除其包含的数组?应该避免使用std::vector并在每个元素上迭代调用delete[]。@morph:我不认为Boost提供了适合这种情况的方法,所以请编写您自己的克隆分配器。大概他们不提供的原因是他们不认为包含指向C数组指针的
ptr_向量
非常有用——这有点难看,因为ptr_向量访问器只给每个数组的第一个元素提供引用。我猜你最终会写
(&my_vector[0])[1]
,用大小和其他类似的肮脏东西来维护一个单独的容器。如果阵列大小均为4,则使用
boost::array
.Hm的
vector
ptr_vector
。。我学会了在使用运算符new创建的指针上调用delete,在使用运算符new[]创建的数组上调用delete[]。在使用
new[]
分配的数组上使用
delete
(反之亦然)会产生未定义的行为。关于“书中写的内容”,您是正确的,但我说的是“它在现实中是如何工作的”@ PavelkOLDIN:考虑一个数组形式存储分配的大小的实现,并且单个对象表单从对象大小推断它。错误地调用
delete
将推断出错误的大小,因此可能会浪费大量内存;错误地调用
delete[]
将读取无效的大小,这几乎会导致任何情况发生。这只是一个例子,如果你试图依赖你对未定义行为的猜测,那么实现可能会出错。正如Mike Seymour所说,问题在于分配的大小,以及在删除时是否可以知道,或者是否必须存储。delete和delete[]是不同的运算符,这是有原因的。缺点不仅仅是内存丢失,它是一个损坏的堆。