gpt4 book ai didi

c++ - 重新分配时 vector 调用析构函数

转载 作者:行者123 更新时间:2023-12-01 14:25:38 25 4
gpt4 key购买 nike

我有一个动态分配的指向类的 3D 指针数组:

class Foo {
public:
int a;
float b;
float c;
Foo(int x, float y, float z) { a = x; b = y; c = z; }
};

在类里面:

class Bar {
public:
Foo ****p_arr;

Bar();
~Bar();
void Create();
};

像这样分配(在 Bar::Create() 中):

p_arr = new Foo***[ARR_SIZE];
for (unsigned int i = 0; i < ARR_SIZE; ++i) {
p_arr[i] = new Foo**[ARR_SIZE];
for (unsigned int j = 0; j < ARR_SIZE; ++j) {
p_arr[i][j] = new Foo*[ARR_SIZE];
for (unsigned int k = 0; k < ARR_SIZE; ++k) {
if (rand() % (k + 1) < 1)
p_arr[i][j][k] = new Foo(i, j, k * 0.1f);
else
p_arr[i][j][k] = nullptr;
}
}
}

我想删除它(在 ~Bar() 中):

for (unsigned int i = 0; i < ARR_SIZE; i++) {
for (unsigned int j = 0; j < ARR_SIZE; j++) {
for (unsigned int k = 0; k < ARR_SIZE; k++) {
if (p_arr[i][j][k] != nullptr)
delete p_arr[i][j][k];
}
delete[] p_arr[i][j];
}
delete[] p_arr[i];
}
delete[] p_arr;

我有一个 std::vectorBar,当我 push_back 到 vector 新项时, vector 正在重新分配和调用析构函数。当我再次访问 p_arr 时,它被释放并且程序在析构函数中崩溃。它说:

0xC0000005: Access violation reading location 0xFFFFFFFF.

这里崩溃了:

if (p_arr[i][j][k] != nullptr) // <- here
delete p_arr[i][j][k];

我该如何解决?

最佳答案

您可以使用一维数组来存储 N 维数组,只要 N-1 维具有相同的固定大小,就像您这里的一样。这样它只需要 1 次内存分配,提高了内存利用率和局部性并消除了所有不必要的复杂性。

例子:

#include <memory>

struct Foo {
int a = 0;
float b = 0;
float c = 0;
};

int constexpr ARR_SIZE = 10;

Foo& at(std::unique_ptr<Foo[]> const& a3d, unsigned i, unsigned j, unsigned k) {
return a3d[(i * ARR_SIZE + j) * ARR_SIZE + k];
}

int main () {
std::unique_ptr<Foo[]> a3d{new Foo[ARR_SIZE * ARR_SIZE * ARR_SIZE]};
at(a3d, 0, 0, 0) = {1,2,3};
}

而不是 std::unique_ptr<Foo[]>你可以使用 std::vector<Foo> - 后者是可复制的。

关于c++ - 重新分配时 vector 调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61510556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com