Почему я получаю нарушение прав доступа при использовании memset с большим _Size? - PullRequest
0 голосов
/ 18 января 2020

Итак, в моем коде 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, я получаю ошибку нарушения записи доступа. Я наблюдал за переменной m_data в Visual Studio, и вот что я получаю:

enter image description here

Так в чем проблема и как ее решить? Я довольно новичок в C ++.

Ответы [ 2 ]

2 голосов
/ 18 января 2020

Я подозреваю, что вы действительно хотите это:

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

Или, как уже отмечали другие, этого будет достаточно:

m_data = new _Scalar[m_size]();

В зависимости от того, что находится внутри скалярного объекта, memset может или не может быть безопасным. Я видел некоторые неудачные ошибки при использовании memset для «обнуления» объекта, который содержал члены с выделенной памятью.

Лучшим подходом может быть использование конструктора Scalar, просто гарантирующего, что все члены обнулены. Зависит от того, имеете ли вы контроль над кодом этого класса.

0 голосов
/ 19 января 2020

конечно, он фактически не был выделен, с размером 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;
...