繁体   English   中英

std :: vector内存分配问题

[英]std::vector memory allocation issue

我在尝试删除指针向量时遇到问题:

std::vector<float*> *v;

v = new std::vector<float*>;
v->assign(2, new float[2]);

for (int i = 0; i < 2; ++i)
{
    delete[] v->at(i);
}
delete v;

我正在删除整个向量中的每个元素,但我仍然得到一个断言。 你能告诉我我做错了什么吗?

先感谢您。

这不符合你的想法:

v->assign(2, new float[2]);

分配一个大小为2的数组,然后将两个指针存储在vector delete ,会delete相同的指针两次。

如果你想要一个多维数组,你可以试试std::vector< std::array< float, 2 > > newdelete自己是一种代码味道。 (同样适用于new vector … ;这可能不是你真正想要的。)

v->assign(2, new float[2])作用与:

float *f = new float[2];
for(int i = 0; i < 2; i++)
   v->push_back(f);

当然,这可能不是你想要的 - 你可能想要:

for(int i = 0; i < 2; i++)
{
   float *f = new float[2];
   v->push_back(f);
}

vector上使用new是完全错误的 - 只需使用普通向量。 在它里面,放一个vector<float> - 或者,如果你每次只想要两个元素,使用类似的东西:

struct f2 { float a; float b; };
vector<struct f2> v;

通常,拥有原始 拥有指针并不是一个好主意(除非在特殊情况下,例如,当您定义一些自定义的高性能高度专业化数据结构时)。

在您的代码中 - 除非您处于特殊情况 - 在现代C ++ delete ,不应该显式调用newdelete

您的代码示例样式似乎更像Java和其他基于垃圾收集的基于引用语义的语言样式。 相反,C ++倾向于偏好值语义 (例如,更喜欢: MyClass x;MyClass * px = new MyClass();如果你真的需要一些拥有指针,请使用智能指针,std::shared_ptrstd::unique_ptr ):

// Your original code:
//
//   std::vector<float*> *v;
//   v = new std::vector<float*>;
//
// Not good, since:
// 
// 1. You have a std::vector of owning pointers
//    (std::vector<float *>)
//
// 2. You have a raw owning pointer for the containing std::vector itself
//    (v = new std::vector<....>)
//

编写代码的更现代和正确的方法可以使用vectorvector S(而不是vector原所属指针float* ):

//
// Vector of vectors (i.e. 2D matrix), allocated on the stack
// Note: no raw owning pointers here.
//
vector<vector<float>> v;

然后你可以使用std::vector::push_back()或其他一些std::vector方法来填充向量。


作为2D矩阵的更高性能和更少开销的替代方案,您可以使用单个1D std::vector ,并在单个 1D 连续向量中线性化 2D矩阵的内容,其大小为Rows * Columns ,例如:

vector<float> matrix;
matrix.resize( Rows * Columns );

要访问位置处的元素(rowIndex, columnIndex) ,您可以使用这样的公式(如果您按行存储矩阵元素,即行#1行#2 ,..., 行#N ):

indexInVector = columnIndex + rowIndex * Columns;

所有这些都可以很好地包装在类模板template <typename T> class Matrix {...}; ,使用适当的方法读取和写入矩阵元素,并包含std::vector<T>作为数据成员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM