Segfault, когда я добавляю объект к <vector> - PullRequest
0 голосов
/ 15 января 2011

Я написал кусочки кода двумя разными способами: используя двумерный массив в качестве матрицы и используя boost :: ublas :: matrix. Когда я добавляю этот объект в первый случай, он работает, но во втором я получаю ошибку сегментации. Я хочу использовать второй способ, поэтому, если кто-нибудь знает, почему я получаю сегфо, я буду благодарен.

код:

img.h

#include <Magick++.h>
#include <string>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

using namespace boost::numeric::ublas;
using namespace std;
using namespace Magick;

class Img
{
    public:
        Img();
        Img(const string path2file);

        unsigned int width, height;
        string filename;
    private:
        typedef struct pix
        {
            Quantum R;
            Quantum G;
            Quantum B;
        } pix;

        matrix<pix> p;

        pix **pixels;
    string format;
};

img.cpp

Img::Img(const string path2file)
{
 Image file;
 unsigned int i, j;
 Color pixel;

 file.read(path2file);

 filename = path2file;
 width = file.size().width();
 height = file.size().height();

// begin of first way
 pixels = (pix**)malloc(sizeof(pix*)*height);
 for(i=0 ; i<height ; ++i)
  pixels[i] = (pix*)malloc(sizeof(pix)*width);

 for(i=0 ; i<height ; ++i)
 {
  for(j=0 ; j<width ; ++j)
  {
   pixel = file.pixelColor(j, i);

   pixels[i][j].R = pixel.redQuantum();
   pixels[i][j].G = pixel.greenQuantum();
   pixels[i][j].B = pixel.blueQuantum();
  }
 }
// end of first way

// begin of second way
 p.resize(height, width);
 for(i=0 ; i<height ; ++i)
 {
  for(j=0 ; j<width ; ++j)
  {
   pixel = file.pixelColor(j, i);

   p(i, j).R = pixel.redQuantum();
   p(i, j).G = pixel.greenQuantum();
   p(i, j).B = pixel.blueQuantum();
  }
 }*/
}
// end of second way

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

main.cpp

#include <iostream>
#include <stdio.h>
#include "img.h"
#include <vector>

using namespace std;

int main(void)
{
 std::vector<Img> files;
 files.push_back(Img("files/mini.bmp"));
 return 0;
}

Ответы [ 4 ]

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

Загрузите программу в gdb и заставьте ее аварийно завершить работу.Введите в консоли gdb bt или backtrace, и вы получите кадр стека всех сделанных вызовов, и вы сможете увидеть, что вызывает segfault.

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

проблема была в определении как я написал. должно быть:

vector<Img*> files;

вместо

vector<Img> files;

и измените инициализирующие объекты с

Img tmp("path_to_file");

до

Img* tmp = new Img("path_to_file");

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

Спасибо за вашу помощь!

0 голосов
/ 15 января 2011
pixels = (pix**)malloc(sizeof(pix*)*height);

Это кажется странным, malloc возвращает указатель (void), а не указатель на указатель, но он может работать для массива [] [], я думаю. После повторного прочтения все в порядке: p

Наличие как класса Img, так и другого образа, который вы создаете с помощью переменной с именем file, может немного сбить с толку.

Некоторый код также отсутствует (например, 'p'), но то, что там, кажется, хорошо. Если бы я был тобой, я бы поместил несколько функций printf () здесь и там, чтобы определить, где происходит сбой программы. Лучше всего было бы, чтобы индексирование p (i, j) вышло за пределы.

Удачи!

0 голосов
/ 15 января 2011

Запустите вашу программу под valgrind , это поможет вам найти причину и местонахождение ошибки.

...