2013-03-08 4 views
0

У меня есть зЬй :: вектор, который вызывает некоторые очень странной SEG ошибкивектор :: ясно() вызывает ошибку сегм

//A.h 
class A{ 
private: 
    std::vector<float> data; 
public: 
    void set(const std::vector<float>& data); 
}; 
//A.cpp 
void A::set(const vector<float>& data){ 
    this->data.clear(); // crashes on this line 
    for(float f : data) this->data.push_back(f); 
} 

При каких обстоятельствах возможно мог бы вектор :: Clear() вызывает ошибку сегм ? Первоначально у меня было

void A::set(const vector<float>& data){ 
    this->data = data; 
} 

и была та же проблема. Я переключился на выше, чтобы отлаживать. Это на gcc 4.7.2, x86_64

+0

Аргумент, называемый 'data' и элементом данных, называемым' data' тоже ... Почему вы вызываете эту двусмысленность для себя? Мое предложение состоит в том, чтобы переименовать данные 'data' в' data_' – LihO

+0

Скорее всего, вы где-то повредили память. Вы неправильно переписываете память, занятую объектом A. – user1610015

+0

Но я согласен, что код выше не несет ответственности за segfault, проблема в другом месте. – LihO

ответ

3

IF он выходит из строя именно в вызове «data.clear» (я имею в виду, именно по этой линии, а не где-то внутри ясно), то не забудьте проверить this указатель на линии разлома.

Если так или иначе ваш $ это значение null или trash из-за накопленных эффектов предыдущих ошибок, тогда эта строка может вести себя аналогично.

На (почти) другой руке, если он фактически сбой где-то внутри прозрачного элемента, и вы просто вырезали stacktrace, чтобы сделать описание проблемы более сукцином, тогда все же возможно быть той же причиной.

Вы можете легко проверить указатель «this» для NULL в отладчике. Кроме того, обнаружение trashvalues ​​не сложно: добавьте некоторые тестовые поля в класс A, заполните их конструктором с некоторыми предсказуемыми значениями BUT NOT CONSTANT, и когда приложение завершится с ошибкой, проверьте, соответствует ли this-> mytestvalue. Если $ this выровняется, то заостренные значения теста очень часто будут почти случайными.

+1

Вы были правы, это оказалось вызовом vector :: clear() после того, как A, содержащий его, уже вышел из сферы видимости. благодаря –

2

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

+0

Рад, что я мог бы помочь. –