为什么在使用具有大_Size的memset时出现访问写入冲突?

问题描述 投票:0回答:2

所以我的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)

例如,对于m_size为15,一切正常。但是,当m_size为10000时,出现访问写入冲突错误。我在Visual Studio中观看了m_data变量,这就是我得到的:

enter image description here

那么问题是什么以及如何解决?我是C ++的新手。

c++ memory memset
2个回答
2
投票

我怀疑您真的想要这个:

m_data = new _Scalar[m_size];
for (int i = 0; i < m_size; i++) {
   m_data[i] = {};
}

或者正如其他人指出的那样,就足够了:

m_data = new _Scalar[m_size]();

取决于标量对象内部的内容,内存集可能是安全的,也可能是不安全的。我已经看到memset用于将包含分配了内存的成员的对象“归零”一些失败。

一种更好的方法可能是让Scalar的构造函数只是确保所有成员都为零。取决于您是否可以控制该类的代码。


0
投票

当然,它实际上尚未分配,大小为0

_Scalar* m_data;

//..
//In the constructor

m_data = new _Scalar[m_size];   // allocated as m_size size of _Scalar

memset(m_data, 0, sizeof(_Scalar) * m_size)

//..
delete m_data;
© www.soinside.com 2019 - 2024. All rights reserved.