标准::矢量内存分配问题
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
时,同一指针将被删除两次。
如果你想要一个多维数组,你可以尝试std::vector< std::array< float, 2 > >
。做new
和delete
自己是一种代码气味。(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++11/14中,不应该显式调用new
和delete
。
您的代码示例样式看起来更像是 Java 和其他基于垃圾集合的基于引用语义的语言样式。相反,C++倾向于喜欢值语义(例如,首选:MyClass x;
MyClass * px = new MyClass();
,如果您确实需要一些拥有的指针,请使用智能指针,如 std::shared_ptr
或 std::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<....>)
//
编写代码的一种更现代、更正确的方法是使用 vector
s 的vector
(而不是原始拥有指针float*
的vector
):
//
// 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
,并在大小为 Rows * Columns
的单个 1D 连续向量中线性化 2D 矩阵的内容,例如:
vector<float> matrix;
matrix.resize( Rows * Columns );
要访问位置 (rowIndex, columnIndex)
的元素,您可以使用这样的公式(如果您逐行存储矩阵元素,即 row#1, row#2, ..., row#N):
indexInVector = columnIndex + rowIndex * Columns;
所有这些都可以很好地包装在类模板template <typename T> class Matrix {...};
中,使用适当的方法来读取和写入矩阵元素,并将包含std::vector<T>
作为数据成员。
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++ DLL 堆内存分配问题
- 单链表分配问题 (nullptr)
- 复制到新阵列时出现动态内存分配问题
- 我不知道为什么会发生堆损坏(关于内存分配问题)
- 如果/else语句未显示/可变分配问题的输出;初学者程序员
- Windows 10中的Char*的内存分配问题
- FMOD EX内存分配问题
- 内存分配问题
- 清除并重新填充 std::vector<std::vector<T>>导致分配问题
- c++析构函数解分配问题
- 结构内存分配问题
- 在 2D 图像阵列中裁剪/插入 - 内存分配问题
- 自定义字符串实现,运算符 + 过载内存分配问题
- C++ 向量分配问题
- 阵列分配问题
- 标准::矢量内存分配问题
- ***glibc检测到***和动态分配问题-C++
- CUDA推力内存分配问题
- 堆损坏/坏分配问题立即在主