Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Beim Ausführen Speicherzugriffsfehler

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
sven111
Newbie
Newbie
Beiträge: 5
Registriert: 4. Aug 2005, 08:06

Beim Ausführen Speicherzugriffsfehler

Beitrag von sven111 »

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
Advanced Hacker
Beiträge: 974
Registriert: 30. Apr 2004, 17:40
Wohnort: Berlin

Beitrag von taki »

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.
SuSE 12.3 kernel 3.7.10-1.16-desktop, K Desktop Environment Version 4.10.5 r1 - Medion Titanium Aldi v. 03/2009
sven111
Newbie
Newbie
Beiträge: 5
Registriert: 4. Aug 2005, 08:06

Beitrag von sven111 »

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
Advanced Hacker
Beiträge: 974
Registriert: 30. Apr 2004, 17:40
Wohnort: Berlin

Beitrag von taki »

sven111 hat geschrieben:

Code: Alles auswählen

Camera* Camera::getInstance()
{
        if(camera == NULL) {
                camera = new Camera();
        } else {
                return camera;
        }
}
Beim erstmaligen Zugriff ist camera NULL. Der Returnwert dieser Funktion auch!
sven111 hat geschrieben:

Code: Alles auswählen

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: Alles auswählen

Camera* Camera::getInstance()
{
        if(camera == NULL) {
                camera = new Camera();
        }
        return camera;
}
Ohne else wird ein Schuh draus.
SuSE 12.3 kernel 3.7.10-1.16-desktop, K Desktop Environment Version 4.10.5 r1 - Medion Titanium Aldi v. 03/2009
sven111
Newbie
Newbie
Beiträge: 5
Registriert: 4. Aug 2005, 08:06

Beitrag von sven111 »

ach, bin ich dämlich. vielen dank für die schnelle und gute hilfe.

servus
Antworten