Динамическое распределение массива в вопросе C ++ - PullRequest
2 голосов
/ 31 января 2010

У меня есть структура типа Duplicate У меня есть переменная типа int с именем stringSize, она имеет значение 5 Я создаю динамический массив:

Duplicate *duplicates;
duplicates = new Duplicate[stringSize - 1];

Позже я удаляю [] дубликаты;

У меня только один член в этом массиве? Я проверил, что stringSize - 1 = 4 с помощью отладки. Что я могу сделать, чтобы получить 4 участника, которые мне нужны?

Любая помощь приветствуется, Спасибо //:)

Ответы [ 3 ]

3 голосов
/ 31 января 2010
Duplicate *duplicates;
duplicates = new Duplicate[stringSize - 1];

Действительно дает вам duplicates[0-3] (Предположим, stringSize - 1 равно 4, как вы говорите). Как вы определяете, что получаете меньше?

Я подозреваю, что вы, возможно, делаете что-то вроде: sizeof(duplicates) / sizeof(duplicates[0]), и в случае получения без изменений. Приведенный выше код работает только для статически распределенных массивов, где sizeof(duplicates) будет соответствовать размеру массива в байтах. В вашем случае он просто вернет размер указателя в вашей системе. (duplicates является Duplicate*)

И обязательно: используйте std::vector, если это «настоящий» код.


Ваш отладчик делает все возможное. Что касается этого, вы просто получили указатель на некоторые данные. Рассмотрим:

Duplicate foo;
Duplicate *duplicates_A;
duplicates_A = &foo; // points to one Duplicate

Duplicate *duplicates_B;
duplicates_B = new Duplicate[4]; // points to memory containing 4 Duplicate's

bar(duplicates_A);
bar(duplicates_B);

void bar(Duplicate* p)
{
    // is p a pointer to one value, or is it an array?
    // we can't tell, and this is the same boat your debugger is in
}

Как отладчик, только получив указатель, знать, указывает ли он на массив или только одно значение? Это не может, безопасно. (Это должно было бы как-то определить, был ли указатель на массив, и размер этого массива.)

2 голосов
/ 31 января 2010

Вы не можете использовать sizeof для определения размера динамического массива.На самом деле нет стандартного API для определения размера динамического массива.

Используйте std::vector, если вам нужен доступ к размеру.

0 голосов
/ 31 января 2010

Если вы используете отладчик для просмотра полученных элементов, проблема может заключаться в том, что тип вашей переменной - Duplicate*, который является просто указателем (который в C также является массивом, но тип является просто указатель на один экземпляр Duplicate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...