- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
很长一段时间后我在做 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
的指针。 .但是,它指向的那些东西还不存在。所以当你迭代 i
和 j
最多 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/
我是一名优秀的程序员,十分优秀!