【发布时间】:2020-01-18 19:29:34
【问题描述】:
所以我的 C++ 代码中有一个 _Scalar 类型的变量,它可以采用很多不同的类型(int、double ...)。
所以我在我的模板类中使用 new 操作符来初始化我的指针。当我想分配内存时,我在我的模板类的构造函数中使用了 memset 函数。
//At the beginning of the class
_Scalar* m_data;
//In the constructor
m_data = new _Scalar;
memset(m_data, 0, sizeof(_Scalar) * m_size)
例如,对于 15 的 m_size,一切正常。但是当m_size 是10000 时,我得到一个访问写入冲突错误。我在 Visual Studio 中观看了 m_data 变量,这就是我得到的:
那么问题是什么以及如何解决呢?我对 C++ 很陌生。
【问题讨论】:
-
当你只分配一个却尝试初始化10000,当然不行。
-
new _Scalar只分配一个 _Scalar 实例,你想要new _Scalar[m_size],你正在耗尽内存并且幸运的是 m_size = 15。 -
std::vector<_Scalar> m_data可能是更好的选择。 -
P.S.不要在 C++ 中使用
memset,除非您知道该变量是 POD 类型。 -
什么是
_Scalar?如果它是由用户代码声明的,那么您应该知道禁止声明以下划线开头后跟大写字母的标识符。这些标识符保留给编译器/标准库实现。违反此规则会导致程序具有未定义的行为。