2012-04-29 4 views
-1

Я получаю неверную ошибку нулевого указателя из этого раздела кода. Я предполагаю, что это как-то связано со струнами, но, как я только недавно узнал о них, я не могу найти проблему.Invalid Null pointer - C++

string batchCipherFiles() 
{ 
int count(0); 
string text, file; 
ifstream inputFile; 

cout << " How many files do you wish to encrypt?: "; 
cin >> count; 
for (int i(1) ; i <= count ; ++i) 
{ 
    stringstream ss; 
    ss << "unencrypted" << i << ".txt"; 
    file = ss.str(); 
    inputFile.open(file.c_str(), ios::in); 
    if (inputFile.fail()) 
    { 
     cout << "\n An error has occurred."; 
    } 
    else 
    { 
     while (!inputFile.eof()) 
     { 
      getline(inputFile, text); 
      cout << "\n " << file << " = " << text << "\n\n"; 
      int applyCeasarShift(string,string);   
      applyCeasarShift(text, file); 
     } 
     inputFile.close(); 
    } 
} 

return (0); 
} 

Вот отладки линия от xstring:

#ifdef _DEBUG 
_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _Debug_message(const wchar_t *message, const wchar_t *file, unsigned int line) 
{ // report error and die 
    if(::_CrtDbgReportW(_CRT_ASSERT, file, line, NULL, message)==1) 
    { 
     ::_CrtDbgBreak(); 
    } 
} 

Заранее спасибо за любую помощь.

EDIT: ошибка возникает в операторе Return, а в выписке из xstring желтая стрелка указывает на «:: _ CrtDbgBreak();»

EDIT 2:

xstring: 
basic_string(const _Elem *_Ptr) 
    : _Mybase() 
    { // construct from [_Ptr, <null>) 
    _Tidy(); 
    assign(_Ptr); 
    } 

xutility: 
template<class _Ty> inline 
void _Debug_pointer(const _Ty *_First, _Dbfile_t _File, _Dbline_t _Line) 
{ // test iterator for non-singularity, const pointers 
if (_First == 0) 
    _DEBUG_ERROR2("invalid null pointer", _File, _Line); 
} 

stdthrow: 
#ifdef _DEBUG 
_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _Debug_message(const wchar_t *message, const wchar_t *file, unsigned int line) 
{ // report error and die 
    if(::_CrtDbgReportW(_CRT_ASSERT, file, line, NULL, message)==1) 
    { 
     ::_CrtDbgBreak(); 
    } 
} 

Надеюсь, это правильный материал.

+1

, на какой строке происходит ошибка? – Chris

+1

, показывая верхнюю часть stacktrace, абсолютно бесполезен. Какая линия происхождения? –

+0

Просьба показать всю трассировку стека. Нам нужно знать, что называется '_CrtDbgBreak()', и то, что называется _that_ функцией, и так далее. –

ответ

4

Проблема заключается в том, что string является тип возвращаемого значения для batchCipherFiles но return (0); возвращается: либо изменить тип возвращаемого или вернуть string.

Я думаю, что return (0); будет неявно преобразован в std::string((char*)0);, что приведет к сбою. В документации для std::string constructor указывается:

Создает строку с содержимым символьной строки с нулевым символом, на которую указывает s. Длина строки определяется первым нулевым символом. s не должен быть указателем NULL.

+0

Я изменил функцию на int, и она работает! Большое вам спасибо, очень быстрый ответ. – user1364552

+0

@ user1364552: Если вам не нужно возвращать значение, используйте 'void'. То есть 'void batchCipherFiles() {/ **** /; вернуть; } ' – MSalters

1

Если ошибка возникает в операторе return, вероятно, что какой-либо другой код использует возвращаемое значение как значение указателя. В стандарте C++ указывается, что при использовании указателя, как и NULL, он обрабатывается так же, как NULL, поэтому, вероятно, это ваша проблема.

+0

Правильно: «другой код» является «string :: string (const char *)' – MSalters