2013-04-15 2 views
0

Я пытаюсь скопировать широкую c-строку из одного места в другое. Я использую Visual Studio 2012 Express на 64-битной платформе Windows8. Он отлично работает, если я не попробую запустить приложение на моем основном компьютере с Windows7 x64. Он срабатывает мгновенно. Ошибка исключения, хотя это беспорядочный сбой без какого-либо отслеживаемого кода ошибки. Если вам нужна более конкретная информация о самой аварии, я постараюсь ее предоставить. Когда я комментирую копирование, программа работает отлично. Поэтому довольно очевидно, что проблема заключается в самой функции. Вот строка, которая делает все копирования:wmemcpy & wcscpy функции, вызывающие сбои

virtual void CClass::ChangeText(); 
void CClass::ChangeText(float _f) 
{ 
    std::wstringstream wss; 
    wss << _f; 
    wcscpy(const_cast<wchar_t *>(this->m_lpszWideText),wss.str().c_str()); 
} 

^падает на win7/работает на Win8

Моя дикая догадка, что новый компилятор использует более новую версию wmemcpy, что просто не работает на Windows 7? Разве программа не вылетает только тогда, когда она достигает линии вызова функции?

+2

Как 'm_lpszWideText 'определено? – hmjd

+0

Это мой собственный (текстовый компонент) класс: указатель участника: 'private: const wchar_t * m_lpszWideText;' – user1756573

+1

Как вы выделяете для него память? Почему он 'const', когда он требует изменения? Почему бы просто не использовать 'std :: wstring'? – hmjd

ответ

0

грохотом с Стринг-Copy алгоритмы имеют, как правило, два источника:

  1. Ваш источник не NULL-Отменено В вашем примере это не так, потому что вы извлечь его из wstringstream :: c_str ()

  2. Ваше местонахождение недостаточно велико, чтобы обрабатывать исходные данные, и поэтому записывается из Bounds. Это может быть причиной вашего краха, значит, ваш this-> m_lpszWideText слишком мал (просьба дать Декларацию о нем и, если она выделяется динамически показывает нам, как.)

+0

Невозможно, иначе оно будет разбиваться на каждой платформе. Теперь это 'wchar_t WideText [150];' и я сначала присваиваю ему значение через wcscpy(). Он по-прежнему падает на другом компьютере и отлично работает на win8 ... – user1756573

+0

Я назначаю ему значение 100 через функцию ChangeText, для которой я вставил код в свой предыдущий пост. – user1756573

+0

Возможно, у Win8 есть другое управление памятью, чем Win7, что означает, что вы можете писать из своей памяти, не записывая в защищенную область, а в win7 вы выписываете из области. Возможно, это проблема 64/32 бит? Проверьте размер строки для копирования до ее копирования, если она подходит? – EGOrecords