2017-02-22 47 views
2

У меня есть очень странный вопрос в, казалось бы, простой код (для целей отладки, я упростил теперь в значительной степени этот код):Странное поведение памяти - C++

class Buf { 
    Frame ** frames; 

    Buf(int a); 
    int a; 
    long b, c, d 

} 
Buf::Buf(int size){ 

    a = size; 
    frames = new Frame*[size]; 

    for (int f = 0; f < size; ++f){ 
     frames[f] = new Frame; 
    } 

    b = c = d = 5; // (***) 
} 

класс Рама очень простой и небольшой, Я отключил любые операции с памятью в своем конструкторе/деструкторе.

В main Я зову:

Buf* buf = new Buf(50); 

После того, как в то время он прекрасно работает, но большую часть времени она работает нормально до (***) линии, а затем, когда я прохожу эту линию, как я может видеть в отладчике, * кадр, кадр [1] и т. д. становится равным 5 (!) или любому другому числу, которое я ввел в задание.

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

Как я уже сказал, я упростил свою программу, чтобы быть чрезвычайно тривиальным, но не могу найти ошибку.

Любые предложения/помощь будут фантастическими!

UPDATE:

Я скопировал код на другой компьютер (с аналогичной конфигурацией), и я не могу воспроизвести проблему там. На исходном компьютере я могу воспроизвести проблему, выполняю ли я проект из XCode или Eclipse/командной строки (разные копии кода).

+0

Почему вы управляете указателями самостоятельно? Это ошибка. –

+2

Три вещи: Почему вы используете указатель на указатель на 'Frame' вместо' std :: vector '? Тогда почему вы не используете списки инициализаторов? И почему вы динамически выделяете объект 'Buf' в своей функции' main'? –

+5

Предложение: если вы считаете, что класс «Frame» не связан с проблемой, замените его на «int», добавьте «main», и у вас есть [MCVE] (http://stackoverflow.com/help/ mcve), что значительно поможет в диагностике. – yeputons

ответ

0
frames = new Frames*[size]; 

, что это неправильно, переменная «кадры» определяется как указатель на указатель на Frame, а не указатель на указатель на Frames.

+3

Правда, но очень неясно, является ли это реальной проблемой. Скорее всего, это не ошибка компиляции. Мы должны ждать этого MCVE. –

+0

@BaummitAugen действительно очень неясно, но на основе минимального количества заданного кода кажется очевидным кандидатом. Это была бы ошибка компиляции, если Frames * не существовало *; но поскольку мы используем указатели здесь, а не векторы или безопасные указатели, некоторые из них, и в зависимости от используемого компилятора и его параметров, это может быть «только» предупреждением, но скомпилировать просто отлично. Однако, если sizeof (Frames)

+0

* «но на основе минимального количества приведенного кода кажется очевидным кандидатом». * И поэтому я предлагаю подождать, пока вопрос не будет в состоянии ответственности. –

 Смежные вопросы

  • Нет связанных вопросов^_^