• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Beim Ausführen Speicherzugriffsfehler

sven111

Newbie
Hi,

ich habe ein Programm unter kdevelop geschrieben. Beim Kompilieren gab es keine Fehler. Wenn ich nun das Programm auf der Kommandozeile ausführe, kommt nur die Meldung Speicherzugriffsfehler. Dann habe ich gdb gestartet und erhalte folgende Fehlermeldungen:

(gdb) run
Starting program: /home/knebelka/Sources/test/camera

Program received signal SIGSEGV, Segmentation fault.
0x0804991b in Camera::Camera ()
(gdb) bt
#0 0x0804991b in Camera::Camera ()
#1 0x080496ed in Camera::getInstance ()
#2 0x0804a15b in main ()
(gdb) s
Single stepping until exit from function _ZN6CameraC1Ev,
which has no line number information.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.


ich weiss, dass man viel dazu im netz findet, aber meist gibt es dazu keine Antwort oder nichts was mir weiterhilft.

Vielen Dank im Voraus.
 

taki

Advanced Hacker
Sieht nach einem unzulässigen Zugriff auf einen Pointer aus. Ohne Source kann man da nichts zu sagen, nur spekulieren... Schätze, Du möchtest im Konstruktor Deiner Klasse camera auf eine Pointervariable zugreifen bevor Du sie gesetzt hast.
 
OP
S

sven111

Newbie
sorry, hätte ich sofort dran denken sollen. hier ein programmauszug

using namespace std;

Camera* Camera::camera = NULL;


Camera* Camera::getInstance()
{
if(camera == NULL) {
camera = new Camera();
} else {
return camera;
}
}

Camera::Camera()
{
c_handle = NULL;
handle_array = NULL;
num_camera = 0;
run_stop = 0;
buffer_lag = 0;
shutter = 0.0;
cam_state = NULL;
run_thread = true;
thread_stopped = false;

pthread_mutex_init(&camera_lock, NULL);
pthread_mutex_init(&storage_lock, NULL);

if(createCamera() != true){
cout<<"error, could not create camera!";
}
}

bool Camera::createCamera()
{
int index = 0;
handle_array = camwire_bus_create(&num_camera);
if(num_camera <=0 || handle_array == NULL) {
return false;
}
if(num_camera == 1) {
while(handle_array[index] == NULL) {
index++;
}
c_handle = handle_array[index];
if (camwire_create(c_handle) != CAMWIRE_SUCCESS) {
return false;
}
if(camwire_get_state(c_handle, cam_state) == CAMWIRE_SUCCESS) {
return true;
}
}

if(num_camera > 1) {
return false;
}
return false;
}

int main(void){
Camera *c =Camera::getInstance();
int i = c->FrameQueueSize();
cout<<"FrameQueueSize: "<<i<<endl;
if(c->setCameraShutter(5)==false){
cout<<"Konnte Shutter nicht setzen"<<endl;
}

}

und dies gehört zum header:

class Camera
{
private:
Camwire_handle c_handle;
Camwire_handle *handle_array;
int num_camera;
int run_stop; // 1 => running, 0 => stopped
float frame_rate, shutter;
Camwire_state *cam_state;
static Camera* camera;
Camera();

pthread_mutex_t camera_lock;
pthread_t runner;

int *buffer_lag;
bool createCamera();
nodeid_t * camera_nodes;
raw1394handle_t raw_handle;
bool run_thread;
bool thread_stopped;
bool oneFrame;
static void* fetchFrames(void* Args);
void** tmp;
dc1394_cameracapture cam_capture;
 

taki

Advanced Hacker
sven111 schrieb:
Code:
Camera* Camera::getInstance()
{
        if(camera == NULL) {
                camera = new Camera();
        } else {
                return camera;
        }
}

Beim erstmaligen Zugriff ist camera NULL. Der Returnwert dieser Funktion auch!

sven111 schrieb:
Code:
int main(void){
	Camera *c =Camera::getInstance();
	int i = c->FrameQueueSize();
	cout<<"FrameQueueSize: "<<i<<endl;
	if(c->setCameraShutter(5)==false){
		cout<<"Konnte Shutter nicht setzen"<<endl;
}

Damit wird nun auf ein NULL-Objekt zugegriffen. Das ist Dein Speicherzugriffsfehler.

Code:
Camera* Camera::getInstance()
{
        if(camera == NULL) {
                camera = new Camera();
        }
        return camera;
}

Ohne else wird ein Schuh draus.
 
Oben