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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在使用具有大_Size的memset时出现访问写入冲突?相关的知识,希望对你有一定的参考价值。

所以我的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 ++的新手。

答案

我怀疑您真的想要这个:

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

_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;

以上是关于为什么在使用具有大_Size的memset时出现访问写入冲突?的主要内容,如果未能解决你的问题,请参考以下文章

上传大文件时出现奇怪的问题

C语言memset问题

使用 D 切片的 memset() 和 memcpy()

如何使用 memset 初始化具有非 0 值的缓冲区? [复制]

在 STM32 上调用 memset 时出现硬故障异常

尝试接受具有大文件的模型时出现 .net API 错误