Как обрабатывать передачу массивов времени выполнения между классами в C ++ - PullRequest
1 голос
/ 07 мая 2009

Прямо сейчас у меня есть простой класс, который обрабатывает разбор XML-файлов в полезные для меня целые. Выглядит примерно так:

int* DataParser::getInts(){
    *objectNumbers = new int[getSize()];
    for (int i=0;i<getSize();i++){
            objectNumbers[i]=activeNode->GetNextChild()->GetContent();
    }
    return objectNumbers;
 }

В основной части программы я получаю это:

int* numbers= data->getInts();
///Do things to numbers[]
delete numbers;

Все работает нормально до команды удаления, которая все вылетает. Как правильно это сделать?

Ответы [ 5 ]

9 голосов
/ 07 мая 2009

Частично проблема в том, что вы не соединяете new [] с delete []. Это, вероятно, не корень вашей ошибки здесь, но вы должны привыкнуть делать это.

Ошибка почти наверняка связана с кодом, который вы оставили закомментированным. Можете ли вы добавить еще немного контекста, чтобы мы могли видеть, что вы делаете со значением чисел?

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

void DataParser::getInts(std::vector<int>& objectNumbers){
    for (int i=0;i<getSize();i++){
      objectNumbers.push_back(activeNode->GetNextChild()->GetContent());
    }
 }

...
std::vector<int> numbers;
data.getInts(numbers);
3 голосов
/ 07 мая 2009

Вам нужно

delete [] numbers;

Правила всегда, когда вы

ptr = new Type[...];

убедитесь, что вы

delete [] ptr;

вместо обычного

delete ptr;

, что приведет к неопределенному поведению (спасибо Нейлу Баттерворту) и предназначено для удаления одного экземпляра, где указывается ptr, а не массив.

2 голосов
/ 07 мая 2009

просто используйте вместо него std :: vector;

std::vector<int> DataParser::getInts(){
    std::vector<int> objectNumbers(getSize());
    for (int i=0;i<getSize();i++){
            objectNumbers[i]=activeNode->GetNextChild()->GetContent();
    }
    return objectNumbers;
 }
2 голосов
/ 07 мая 2009

Следующая строка:

 *objectNumbers = new int[getSize()];

Что это делает? Если вы возвращаете objectNumbers, это указатель на int, и вы действительно должны делать:

 objectNumbers = new int[getSize()];

В любом случае, C ++ предоставляет вам коллекции (vector, list и т. Д.) - я бы использовал один из них вместо простого массива. Как отмечалось в другом месте, важно сопоставить ваш new с delete и new [] с delete [].

Передача массивов не очень хороший дизайн - вы делаете реализацию общедоступной. Попробуйте передать итераторы в начало и конец массива / коллекции / последовательности int s, вместо этого следуя проекту STL.

1 голос
/ 07 мая 2009

Вы быстро столкнетесь с проблемами и проблемами обслуживания. Подумайте об использовании std :: vector, это правильный способ сделать это.

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