gpt4 book ai didi

c++ - 用户回调中未处理的异常

转载 作者:太空狗 更新时间:2023-10-29 20:37:16 39 4
gpt4 key购买 nike

当我执行以下操作时:

 float name[512][512][3]

我遇到了这个导致我崩溃的大错误。我正在使用 Visual Studio。

我注意到简单地将“静态”放在前面会导致错误消失,但我希望这是一个实例字段。我不确定为什么会这样——阵列不是那么大,而且我有一台功能强大的机器。

尝试 [512][512] 让我崩溃,但 [256][512] 完全没问题。

我已经无计可施了!请帮助:)

最佳答案

数组为 3 MB(在 float 的大多数实现上)。这种大小的对象只能动态分配——3 MB 对于驻留在堆栈上来说太多了。

你有两个选择:一个是保持你的类不变,并确保你只动态分配它(使用 new ,在智能指针中拥有)。

我更喜欢的另一个是使用 std::vector<float>而不是 3 维数组,并将围绕它的索引实现为访问函数。您甚至可以将此 vector 和访问器包装在它们自己的类中,并将其用作您的 name 的类型。数据成员。

第二个选项保证 3 MB 数据永远不会驻留在非动态内存中。


这是这样一个 3D 可访问的可能草图 vector :

template <class T, size_t Dim1, Dim2, Dim3>
class Array3d
{
std::vector<T> data;

public:
Array3d() : data(Dim1 * Dim2 * Dim3) {}

T& at(size_t idx1, size_t idx2, size_t idx3)
{ return data[idx1 * Dim2 * Dim3 + idx2 * Dim3 + idx3); }

T at(size_t idx1, size_t idx2, size_t idx3) const
{ return data[idx1 * Dim2 * Dim3 + idx2 * Dim3 + idx3); }
};

一个更基本的替代方法是动态分配数组本身:

using Array2d = std::array<std::array<float, 3>, 512>;
std::unique_ptr<Array2d[]> name{new Array2d[512]};
name[i][j][k] = 42.0f;

关于c++ - 用户回调中未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35342621/

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