2017-01-12 2 views
0

こんにちは、C++を使用して共有ライブラリ(データ構造)を学ぶために、それは私にこのエラーを与える私は私のプログラムを実行するたびにしようとしています共有ライブラリG ++エラーセグメンテーションフォールト

[email protected]:~$ cd /home/sachin/sDL 
[email protected]:~/sDL$ g++ -fPIC -shared myclass.cc -o myclass.so 
[email protected]:~/sDL$ g++ class_user.cc -ldl -o class_user 
[email protected]:~/sDL$ ./class_user 
0 
Unable to load Sachin's library 
Segmentation fault (core dumped) 
[email protected]:~/sDL$ 

shared.hファイル

typedef struct node 
{ 
    struct node *prev; 
    int data; 
    struct node *next; 
}NODE,*PNODE; 


class SinglyCLL 
{ 
    private : 
    PNODE head; 
    PNODE tail; 
    public : 
    SinglyCLL(); 
    ~SinglyCLL(); 
    virtual void InsertFirst(int); 
    virtual void InsertLast(int); 
    virtual void InsertAtPosition(int,int); 
    virtual void DeleteFirst(); 
    virtual void DeleteLast(); 
    virtual void DeleteAtPosition(int); 
    virtual int Count(); 
    virtual void Display(); 

}; 

myclass.ccファイル

#include"sharedfile.h" 
#include<iostream> 
using namespace std; 

SinglyCLL::SinglyCLL() 
{ 
    head=NULL; 
    tail=NULL; 
} 

void SinglyCLL::InsertFirst(int ino) 
{ 
    PNODE temp=head; 
    PNODE newN=NULL; 

    newN=new NODE; 
    newN->next=NULL; 
    newN->data=ino; 
    newN->prev=NULL; 

    if((head==NULL)&&(tail==NULL)) 
    { 
     head=newN; 
     tail=newN; 
     tail->next=head; 
     head->prev=tail; 
    } 

    newN->next=head; 
    head->prev=newN; 
    head=newN; 
    tail->next=head; 
    head->prev=tail; 

} 

void SinglyCLL::Display() 
{ 
    PNODE temp=head; 

    if((head==NULL)&&(tail==NULL)) 
    { 
     return; 
    } 

    do 
    { 
     cout<<temp->data<<endl; 
     temp=temp->next; 

    }while(tail->next!=temp); 
} 

SinglyCLL::~SinglyCLL() 
{ 
    delete head; 
    delete tail; 
} 

extern "C" 
{ 
    SinglyCLL *create() 
    { 
     return new SinglyCLL; 
    } 
    void destroy (SinglyCLL* p) 
    { 
     delete p; 
    } 
} 

class_user.ccファイル

#include <stdio.h> 
#include <stdlib.h> 
#include <dlfcn.h> 
#include <iostream> 
#include "sharedfile.h" 
using namespace std; 

int main() 
{ 
    void *p=NULL; 
    SinglyCLL *ptr=NULL; 
    SinglyCLL* (*fp1)()=NULL; 
    void (*fp2)(SinglyCLL*)=NULL; 

    p=dlopen("/home/sachin/sDL/myclass.so",RTLD_LAZY); 
    if(!p) 
    { 
     cout<<p<<endl; 
     printf("Unable to load Sachin's library \n"); 
    } 

    fp1=(SinglyCLL*(*)())dlsym(p,"create"); 
    fp2=(void(*)(SinglyCLL*))dlsym(p,"destroy"); 

    ptr=fp1(); 

    ptr->InsertFirst(10); 
    /*ptr->InsertAtPosition(70,1); 
    ptr->InsertAtPosition(80,2);*/ 
    ptr->Display(); 

    fp2(ptr); 
    dlclose(p); 
    return 0; 
} 

プログラム内でこのプログラムのセグメンテーションフォルトが発生するたびに、データを格納するリンクリストを作成するために単一の循環リストを使用しています 、コードを通過してエラーが見つかりませんでした私は何もエラーなしで正常に実行されている共有ライブラリと単独でリンクされたリストを実行しようとしたとして実行されていない理由を理解することができない、私はファイルにアクセスするためのアクセス許可をチェックし、だから問題はない。

私は教育目的のためだけにデータ構造共有ライブラリを作成することを学んでいるので、問題の原因となっている部分の外でこのコードで改善や変更の可能性があります。

この問題を解決するのを手伝ってください。

ありがとうございます。

+0

ldd は、そのバイナリの実行時にロードされる.soを表示します。あなたのためにギャップがある場合、それは実行時にローダーがそれを見つけられないことを意味します。環境変数LD_LIBRARY_PATHを設定する必要があります。そして、.soと論理の問題を抱かないでください。リンクされたリストを試す前に.soから簡単な関数を呼び出すことができるかどうかを見てください。 – Elan

+1

'head'と' tail'が同じものを指している場合は、二重の 'delete'を行います。 – greatwolf

+0

'dlerror'を呼び出してエラーメッセージを取得します。 – molbdnilo

答えて

1

編集:コードを修正した後、私の答えが変わります!

@ Zsigmondは、ヘッダファイルにメソッドを定義する必要があることを指摘しています。しかし、それは完全に問題を解決するわけではありません。

ソースをコンパイルして見た問題を再現しました(ロード時のセグメンテーションフォルト)。私はその後

shared.hに他の機能の実装を追加することによって、私はこのエラーを得たことを決議:

*** Error in ./class_user: double free or corruption (fasttop): 0x0000000002478660 ***

私はfp2(ptr)ラインにこれ​​を絞り込むことができました。この行をコメントアウトするとエラーが取り除かれました。

更新されたコードは以下のとおりです。

更新shared.h:

// Header Guard (prevents duplicate symbols) 
#ifndef __SHARED_H 
#define __SHARED_H 

// C++ syntax for a struct doesn't need typedef 
struct node 
{ 
    node* prev; 
    int data; 
    node* next; 
}; 


class SinglyCLL 
{ 
private : 
    node* head; 
    node* tail; 
public : 
    SinglyCLL(); 
    ~SinglyCLL(); 
    virtual void InsertFirst(int); 
    virtual void InsertLast(int); 
    virtual void InsertAtPosition(int,int); 
    virtual void DeleteFirst(); 
    virtual void DeleteLast(); 
    virtual void DeleteAtPosition(int); 
    virtual int Count(); 
    virtual void Display(); 

}; 

#endif // __SHARED_H 

更新myclass.cc:

#include"shared.h" 
#include<iostream> 
using namespace std; 

SinglyCLL::SinglyCLL() 
{ 
    head=NULL; 
    tail=NULL; 
} 

void SinglyCLL::InsertFirst(int ino) 
{ 
    node* temp=head; 
    node* newN=NULL; 

    newN=new node; 
    newN->next=NULL; 
    newN->data=ino; 
    newN->prev=NULL; 

    if((head==NULL)&&(tail==NULL)) 
    { 
     head=newN; 
     tail=newN; 
     tail->next=head; 
     head->prev=tail; 
    } 

    newN->next=head; 
    head->prev=newN; 
    head=newN; 
    tail->next=head; 
    head->prev=tail; 

} 

void SinglyCLL::Display() 
{ 
    node* temp=head; 

    if((head==NULL)&&(tail==NULL)) 
    { 
     return; 
    } 

    do 
    { 
     cout<<temp->data<<endl; 
     temp=temp->next; 

    }while(tail->next!=temp); 
} 

SinglyCLL::~SinglyCLL() 
{ 
    delete head; 
    delete tail; 
} 

extern "C" 
{ 
    SinglyCLL *create() 
    { 
     return new SinglyCLL; 
    } 
    void destroy (SinglyCLL* p) 
    { 
     delete p; 
    } 
} 

// Empty implementations for the other functions 
void SinglyCLL::InsertLast(int) 
{ 

} 

void SinglyCLL::InsertAtPosition(int,int) 
{ 

} 

void SinglyCLL::DeleteFirst() 
{ 

} 

void SinglyCLL::DeleteLast() 
{ 

} 

void SinglyCLL::DeleteAtPosition(int) 
{ 

} 

int SinglyCLL::Count() 
{ 

} 

更新class_user.cc:マイク・Pの提案で編集

#include <stdlib.h> 
#include <dlfcn.h> 
#include <iostream> 
#include "shared.h" 
using namespace std; 

int main() 
{ 
    void *p=NULL; 
    SinglyCLL *ptr=NULL; 
    SinglyCLL* (*fp1)()=NULL; 
    void (*fp2)(SinglyCLL*)=NULL; 

    p=dlopen("/home/mike/Projects/C++/myclass.so",RTLD_LAZY); 
    if(!p) 
    { 
     cout<<p<<endl; 
     cout << "Unable to load Sachin's library" << endl; 
    } 

    fp1=(SinglyCLL*(*)())dlsym(p,"create"); 
    fp2=(void(*)(SinglyCLL*))dlsym(p,"destroy"); 

    ptr=fp1(); 

    ptr->InsertFirst(10); 
    ptr->InsertAtPosition(70,1); 
    ptr->InsertAtPosition(80,2); 
    ptr->Display(); 

    // Un-comment next line to force the 'double free' error. 
    //fp2(ptr); 
    dlclose(p); 
    return 0; 
} 
+0

私のプログラムは私がdlerrorを呼び出した後にエラーを出しています" /home/sachin/sDL/myclass1.so:未定義シンボル:_ZN9SinglyCLL10InsertLastEi "誰も私にそれを解決する方法を教えてもらえますか? –

+0

'myclass1.so'はこれまで言及されていません。もっと正確にしてください。名前をデマングルすると、次のようなメッセージが表示されます。 '/home/sachin/sDL/myclass1.so:undefined symbol:SinglyCLL :: InsertLast(int)' –

+0

_every_仮想メソッドを実装する必要があります。 VMT –

0

あなたはいないあなたがヘッダーに宣言したすべての仮想メソッドを実装する必要があります。デストラクタも修正する必要があります。

SinglyCLL::~SinglyCLL() 
{ 
    node *q, *next; 

    if (head) { 
     next= head->next; 
     delete head; 

     while ((q= next) != head) { 
      next= q->next; 
      delete q; 
     } 
    } 
    head= tail= NULL; 
} 

注:実際は、循環リストであるため、「テール」ポインタを削除することができます。

+0

あなたはデストラクタを書きませんが、デストラクタを追加するだけでセグメンテーション違反は解決されません。 –

+0

デストラクタを修正し、ヘッダに宣言された_every_メソッドを実装すると、セグメンテーション違反が修正されて以来、テストしました。それを試してみてください。 –

+1

しかし、デストラクタを追加しても問題は解決しません。あなたの答えは、他の方法ではなく、デストラクタに言及しています。 –

関連する問題