2016-08-23 90 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(行为); 问题应该是在该行

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

但我不能修复它。 如果我使用来代替:

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   
    }  
... 
} 

我怎样才能解决呢?光! Thanx提前!

+3

为什么malloc的内C++? – user1810087

+2

你为什么要尝试实例化ISRDPresenter,它是一个抽象类! –

+1

不要发送垃圾邮件标签。 C不是C++不是C! – Olaf

回答

3

通过使用malloc而不是new,您跳过了对象的初始化。模式cdcdcdcd以调试模式编译写入新分配的内存,以帮助您检测此类问题。你正试图访问一个虚拟函数,它正在访问一个尚未初始化的vtable。

应该能够做到:

ISRDPresenter* dev = new ASRDPresenter; 
+0

谢谢它是一个标头问题,它现在适用于: ISRDPresenter * dev = new ASRDPresenter; –

相关问题