gpt4 book ai didi

c++ - 访问冲突读取位置0xcdcdcdcd - VS 2010 win7

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:07 24 4
gpt4 key购买 nike

很长一段时间后我在做 C++,有些事情困扰着我。我在这里发现了类似的问题,但没有一个能解决我的问题。那么,这是怎么回事?

我有

SomeClass*** world;

它表示指向 SomeClass 对象的指针矩阵。

后来,在构造函数中,当我尝试初始化它时,会这样做

for(int i = 0; i<20;i++)
for(int j = 0;j<20;j++)
world[i][j] = new SomeClass();

它中断并显示消息:访问冲突读取位置 0xcdcdcdcd。我阅读了这条消息的含义,但仍然不知道如何让它发挥作用。

提前致谢!

最佳答案

我认为了解声明变量时得到 的内容非常重要。就像在内存中实际创建的一样。

那么让我们来看看SomeClass*** world; .这对您有什么帮助?它会给你一个指向SomeClass的指针矩阵吗? ?不,它没有。事实上,您可能会惊讶地发现这只会让您得到一件事——一个指针。是的,没错,只是一个指针。您已经定义了这个 world变量,它是一个指针,这就是你从中得到的全部。那个单指针。

然后该指针应该用于指向其他指针,这些指针又指向指向 SomeClass 的指针。 .但是,它指向的那些东西还不存在。所以当你迭代 ij最多 20 个并做 world[i][j] ,您正在尝试访问根本不存在的指针矩阵。

现在让您编写的内容生效,同时仍然使用 SomeClass*** ,您需要分配指针矩阵:

world = new SomeClass**[20];
for (int i = 0; i < 20; i++) {
world[i] = new SomeClass*[20];
}

所以首先我们分配一个包含 20 SomeClass** 的数组, 然后我们让这些指针中的每一个指向一个分配的数组 20 SomeClass* .这给了你你想要的......

但是等一下 - 这太丑了。 C++ 不应该这样写。这么多的动态分配根本就没有理由。这也意味着你必须记住 delete当你完成它时的一切 - 这也很丑陋。如果您不依赖动态分配,这一切都可以变得容易得多。您可以只创建一个多维数组而不是使用指针,这样您的生活就会轻松得多:

SomeClass* world[20][20];

所以现在world是一个 20 x 20 的指针数组,指向 SomeClass .实际上,您在内存中得到了。你不只是像以前那样得到一个指针。你得到一个完整的多维指针数组!幸运的你。

现在,您可以通过根本不使用指针来使它变得更好。目前,您需要动态分配 SomeClass对象并将指向它们的指针粘贴到数组中。但是为什么不用 SomeClass 的数组呢?相反?

SomeClass world[20][20];

现在你有一个多维数组 SomeClass对象!生活没有比这更好的了。您不必手动分配或删除任何内容。你在内存中得到了一个完整的多维数组,其中每个元素已经是一个 SomeClass。对象,准备好为您服务。

我们甚至可以通过使用标准库中的容器来进一步提高安全性。如果您使用的是 C++03,则可以使用 std::vector<std::vector<SomeObject> >但这可能有点矫枉过正。然而,C++11 引入了一种可以巧妙地替代传统数组的类型,并使其更加安全:std::array .你可以这样使用它:

std::array<std::array<SomeObject, 20>, 20> world;

关于c++ - 访问冲突读取位置0xcdcdcdcd - VS 2010 win7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14002274/

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