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
}
Как отладчик, только получив указатель, знать, указывает ли он на массив или только одно значение? Это не может, безопасно. (Это должно было бы как-то определить, был ли указатель на массив, и размер этого массива.)