2016-08-23 11 views
0

アクセス違反の場所0xCDCDCDD1エラーが表示されています。私はvc9コンパイラを使用しています。new_srdProg_d.exeの0x0040224dで処理されない例外:0xC0000005:アクセス違反の読み取り場所0xcdcdcdd1

マイコード:

#define SRD_EXPORTS 
#include "SRD.h" 
#include "ISRDPresenter.h" 
#include "ISRDFactory.h" 
#include "ISRDevice.h" 

#include "AString.h" 

int main(int argc, char** argv) 
{ 
    ISRDPresenter* dev = (ISRDPresenter*)malloc(sizeof(ISRDPresenter));  // = NewSRDPresenter(); 

    char act[ 128 ]; 
    int commands = argc-1; 

do 
{ 
    if(!commands) 
    { 
     act[ 0 ] = 0; 
     printf("SRD> "); 
#if defined(__IBMC__) || defined (__IBMCPP__) 
     fflush(stdout); 
#endif 
     fgets(act, 128, stdin); 
    } 
    else 
    { 
     strncpy(act, argv[ argc - commands-- ], 128); 
     printf("SRD> %s\n", act); 
    } 

    if(!strncmp(act, "help", 4)) 
    { 
     dev->showHelp(act); 
    } 
... 
} 

エラーがラインDEV->のShowHelp(ACT)です。 問題はライン

ISRDPresenter* dev = (ISRDPresenter*)malloc(sizeof(ISRDPresenter)); 

にする必要があります。しかし、私はそれを修正can't。 私が代わりに使用している場合:

ISRDPresenter* dev = NewSRDPresenter(); 

それは私が使用している場合、識別子が見つかった、とすることができないと言う。

ISRDPresenter* dev = new ISRDPresenter(); 

はISRDPresenterは抽象クラスをインスタンス化することはできませんと言う...

ISRDPresenter.h:

#ifndef __ISRDPRESENTER_H 
#define __ISRDPRESENTER_H 

#define SRD_EXPORTS 
#include "SRD.h" 
#include "ISRDDataTypes.h" 

#include "AIPClass.h" 
class ISRDFactory; 

class ISRDPresenter 
{  
public: 
// ----------------------------------------------------------------------- 
// Destructor 
// ----------------------------------------------------------------------- 
virtual ~ISRDPresenter() {}; 

// ----------------------------------------------------------------------- 
// Function prototypes 
// ----------------------------------------------------------------------- 
virtual void showHelp(char* attr) const = 0; 
virtual void showList(void) const = 0; 
virtual void showInfo(size_t i) const = 0; 
virtual void showFirmware(size_t i) const = 0; 
}; 

#endif /* __ISRDPRESENTER_H */ 

SRDPresenter.h:

#ifndef __SRDPRESENTER_H 
#define __SRDPRESENTER_H 

#define SRD_EXPORTS 
#include "SRD.h" 
#include "ISRDPresenter.h" 

#include "AString.h" 
#include "ISRDFactory.h" 

//----------------------------------------------------------------------------- 
// ASRDPresenter 
//----------------------------------------------------------------------------- 
class ASRDPresenter : public ISRDPresenter 
{ 
public: 
//------------------------------------------------------------------------- 
// ASRDPresenter constructor & destructor 
//------------------------------------------------------------------------- 
ASRDPresenter(); 
virtual ~ASRDPresenter(){}; 

//------------------------------------------------------------------------- 
// Function prototypes 
//------------------------------------------------------------------------- 
void showHelp(char* attr ) const; 
void showList(void) const; 
void showInfo(size_t i) const; 
void showFirmware(size_t i) const; 

private: 
    ISRDFactory* f_srds; 

}; 

SRD_EXPORT_PREF ISRDPresenter* SRD_EXPORT_POST NewSRDPresenter() 
{ 
    return new ASRDPresenter(); 
} 


#endif /* __SRDPRESENTER_H */ 

SRDPresenter.cpp:

#define SRD_EXPORTS 
#include "SRDPresenter.h" 

#if defined(_MSC_VER) 
    #define WIN32_LEAN_AND_MEAN 
#endif 

// --------------------------------------------------------------------------- 
// ASRDPresenter 
// --------------------------------------------------------------------------- 

ASRDPresenter::ASRDPresenter() 
:f_srds() 
{ 
    // empty 
} 

void ASRDPresenter::showHelp(char* attr) const 
{ 

    if(!strcmp(attr, "help")) 
    { 
     printf("\nHelp to the ANOVIS SRD command.\n\n"); 
     printf(" help    : Print this help.\n"); 
     printf(" list    : List all ANOVIS SRD found.\n"); 
     printf(" info   
    }  
... 
} 

私はそれをどのように修正することができますか?光! あらかじめ高尚!

+3

理由のmalloc C++内の? – user1810087

+2

なぜISRDPresenterをインスタンス化しようとしていますか?抽象クラスです! –

+1

タグをスパムしないでください。 CはC++ではありません! – Olaf

答えて

3

newの代わりにmallocを使用すると、オブジェクトの初期化はスキップされました。パターンcdcdcdcdは、この種の問題の検出を支援するために、デバッグモードビルドで新たに割り当てられたメモリに書き込まれます。初期化されていないvtableにアクセスしている仮想関数にアクセスしようとしています。

あなたは行うことができるはず:

ISRDPresenter* dev = new ASRDPresenter; 
+0

Thanxsヘッダーに問題がありましたが、今すぐ使用できます: ISRDPresenter * dev = new ASRDPresenter; –

関連する問題