Ошибка сегментации Qt при возврате функции - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть функция, которая возвращает итератор, и я сохраняю в ней итератор. Это функция, которая возвращает итератор (где building - это перечисление):

vector<building>::iterator it;

for (it = building.begin(); it != building.end(); ++it)
{
    if(it->getType() == type)
        return it;
}

return gebouwen.end();

Теперь, когда я делаю it->isBusy(); Qt падает и выдает ошибку сегментации.

Функция isBusy:

bool isBusy( void) const { return busy ; };

Когда я отлаживаю, отладчик в Qt останавливается на этой строке кода и выдает:

The inferior stopped because it received a signal from the operating system.
Signal name: SIGSEGV
Signal meaning: Segmentation fault

Я не понимаю, почему эта простая функция позволяет системе останавливаться. Я перезагрузился, потому что некоторые люди говорят, что это потому, что у вас утечки памяти. Но это все еще не решает.

Ответы [ 3 ]

3 голосов
/ 29 ноября 2011

Скорее всего, сбой вызван вызовом метода isBusy () для объекта, на который ссылается «конечный» итератор, возвращаемый gebouwen.end().С этим специальным итератором не связано ни одного объекта, и поэтому запускается неопределенное поведение.Вы должны сравнить итератор, возвращаемый этой функцией, с gebouwen.end(), чтобы убедиться, что ваш объект был найден.

Кроме того, наличие void C ++ в качестве списка параметров в C ++ не имеет никакого смысла.В C есть разница между void foo() и void foo (void) - первый подразумевает, что foo может принимать любые аргументы, в то время как второй означает, что он не может принимать никаких аргументов.Но это ничего не значит в C ++ и, следовательно, не имеет смысла, в то время как вам нужно напечатать еще 4 символа без веской причины.

2 голосов
/ 29 ноября 2011

Вы возвращаете итератор локального вектора. Итератор копируется, но вектор возвращается после возврата. Вот и вылетает.

Вместо этого вы, вероятно, захотите вернуть элемент, на который в данный момент указывает итератор: *it.

0 голосов
/ 29 ноября 2011

Действительно ли ваш код:

vector<building>::iterator foo(   vector<building> & gebouwen, Type type )
{
    vector<building>::iterator it;

    for (it = gebouwen.begin(); it != gebouwen.end(); ++it) {
        if(it->getType() == type) 
        return it;
    }
    return it;
}

Тогда применяются либо ответы Влада, либо Тамаса.Вы можете вызывать gebouwen.end () -> isBusy (), что вызывает SIGSEGV.Или называть это после того, как gebouwen выходит за рамки.

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