C ++ - это указатель на одно значение такой же, как динамический массив размера 1? - PullRequest
1 голос
/ 11 ноября 2009

У меня есть этот фрагмент кода, который я рассматриваю для упрощения:

if (numberOfResults > 1)
{

    trackResult_ = new TrackResult[numberOfResults];
    for (int i=0; i < numberOfResults; i++)
        {
            // Make a deep copy
            TrackResult tempResult = result[i];
            TrackResult * clone  = new TrackResult(tempResult);
            trackResult_[i]  = *clone;
        }

    storeJointResults(trackResult_, numberOfResults);
}
else
{
    trackResult_ = new TrackResult(*result);
}

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

Мне интересно, смогу ли я сойти с рук

// even if we just have one result, we init an array size of one
trackResult_ = new TrackResult[numberOfResults];

Однако я в нескольких пунктах проверяю количество результатов и действую соответственно

if (numberOfResults_ == 1)
{
   velocity = trackResult_.velocity;
}

Будет ли этот код работать? Если нет, то почему?

Ответы [ 4 ]

6 голосов
/ 11 ноября 2009

Массив размера 1 не должен быть особым случаем.

Когда вы выделяете динамический массив, вам дается указатель на первый элемент. Если массив имеет размер 1, это практически невозможно отличить от простого выделения одного экземпляра объекта.

Использование вашего особого случая будет работать, если вы измените. к -> Однако я бы порекомендовал не использовать специальный регистр, а просто использовать trackResult_ [0] .velocity

3 голосов
/ 11 ноября 2009

Как векторы слишком сложны? Если что, то упростите ваш код.

3 голосов
/ 11 ноября 2009

Нет, вам нужно убедиться, что вы подбираете правильный скаляр delete или массив delete[] в зависимости от того, говорите ли вы new TrackResult[n]; или new TrackResult;.

Кроме того, это приводит к утечке памяти для каждой итерации цикла:

 TrackResult tempResult = result[i];
 TrackResult * clone  = new TrackResult(tempResult);
 TrackResult_[i]  = *clone;
1 голос
/ 11 ноября 2009

Я согласен с Алексом, используя. Оператор для указателя также не является моим рекомендуемым стилем, так что эти другие пункты должны быть изменены в любом случае, и, таким образом, не отговаривать вас от упрощения фрагмента кода, который вы упоминаете.

...