Проблема с указателем C ++ EasyBMP - PullRequest
1 голос
/ 26 января 2011

Следующий код вызывает ошибку сегментации в строке .ReadFromFile:

int main()
{
// Load in.bmp
BMP * original;

cout << "line " << __LINE__ << ": Got here!" << endl;
original->ReadFromFile("in.bmp"); //Error HERE!
int width  = original->TellWidth();
int height = original->TellHeight();
cout << "line " << __LINE__ << ": Got here!" << endl;

Я использую библиотеку EasyBMP, которая находится над основной функцией.Я знаю, что это как-то связано с памятью и указателями, но я не могу понять, что использовать вместо «оригинал ->» ... Я пробовал (* оригинал).и (и оригинал).но я не могу понять это.Любая помощь?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 26 января 2011

Вы объявили BMP как указатель, но никогда не инициализировали его.

Попробуйте использовать:

BMP original;

или

BMP *original = new BMP();

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

delete original;
2 голосов
/ 26 января 2011

Ваш указатель original указывает на случайную ячейку памяти.Попытка использовать его приведет к неопределенному поведению.Вам необходимо выделить память для BMP объекта и сохранить адрес в этом указателе.Если вы хотите, чтобы ваш объект сохранялся даже после того, как он вышел из функции, используйте original = new BMP(); (не забывайте delete об этом позже), иначе вы можете напрямую сделать BMP original; и использовать его.

1 голос
/ 26 января 2011

В соответствии с руководством, ваш код должен быть:

BMP Image;
Image.ReadFromFile( argv[3] );
0 голосов
/ 26 января 2011

Нет необходимости использовать указатель, попробуйте это:

// Load in.bmp
BMP original;

cout << "line " << __LINE__ << ": Got here!" << endl;
original.ReadFromFile("in.bmp"); //Error HERE!
int width  = original.TellWidth();
int height = original.TellHeight();
cout << "line " << __LINE__ << ": Got here!" << endl;

или если вам нужно использовать кучу do:

BMP* original = new BMP();

, а когда вы закончите, не делайтезабудьте освободить память

удалить оригинал;

...