Общее правило состоит в том, что каждому выражению new
должно соответствовать одно соответствующее выражение delete
.
Ваше выражение new
является правой частью оператора
neco = new int[ahoj+2][2];
поэтому соответствующее выражение delete
дано в выражении
delete [] neco;
Если это не сработает (как вы и утверждаете), это означает, что проблема в каком-то другом коде, демонстрирующем неопределенное поведение.
Ваш цикл
for (size_t i = 0; i < ahoj + 2; i++)
{
delete[] neco[i];
}
неверен, поскольку ни один из neco[i]
не является результатом выражения new
.Так что delete [] neco[i]
имеет неопределенное поведение в каждой итерации цикла.
Учитывая, что ваш пример кода (ов) и описание неполны, я сомневаюсь, что кто-то еще может дать более полезный совет.
Кроме того, выошибаюсь, полагая, что вы не можете использовать стандартный контейнер.Вы можете.
#include <vector>
int main()
{
std::vector<int[2]> avec(ahoj + 2);
int (*neco)[2] = &avec[0];
for (size_t i = 0; i < ahoj + 2; ++i)
{
for (size_t j = 0; j < 2; ++j)
{
neco[i][j] = iter;
++iter;
}
}
}
Единственная разница в том, что avec
выполняет динамическое выделение и освобождение памяти для вас.neco
по-прежнему является указателем на массив, требуемый (согласно вашему описанию) вашим API.Два подхода к этому подходу таковы:
- не изменяет размер
avec
после инициализации neco
(или не инициализирует neco
при изменении размера avec
) - donНе используйте
neco
после того, как avec
прекратит свое существование (поскольку поведение будет неопределенным).
Кроме того, ни один из массивов на самом деле не является статическим.Так что ваш вопрос ошибочен.