в c ++, если я передаю CString в функцию по ссылке и назначаю ее другой CString, она усекается - PullRequest
3 голосов
/ 11 ноября 2011

некоторый простой код начал давать сбои в SDK, с которым я работал, также он, по-видимому, работал правильно в течение длительного времени, и, действительно, я почти уверен, что я скомпилировал части кода, как это, и они имеютработал, но недавно потерпел неудачу.

пример со значениями, подтвержденными в отладчике:

void SomeFunction(CString& paramstring) //let's pretend we pass a string with the value "hello"
{
     int size=paramstring.GetLength(); //size now contains an incorrect shorter value like 4
     CString localstring=paramstring;//localstring contains something like "hell" or "hel"
}

любые идеи, почему это может происходить

Ответы [ 3 ]

2 голосов
/ 11 ноября 2011

я попробовал ваш код в консольном приложении, и он отлично работает, проблема в другой части вашего кода, вот код, попробуйте его (используйте MFC)

#include <iostream>
#include <afx.h>
using namespace std;

//let's pretend we pass a string with the value "hello"
void fun(CString& paramstring)
{
    int size=paramstring.GetLength();  
    cout<<"size= "<<size<<"\n";
    CString localstring=paramstring;
    wcout<<"string = "<<(LPCTSTR)localstring<<"\n";
}

int main()
{
    CString s ("Hello");
    fun(s);
}

вывод:

size = 5 string = Hello

1 голос
/ 11 ноября 2011

Мое единственное предположение, что у вас есть перезапись памяти, повреждающая этот объект.

Время вывести электроинструменты. Установите Purify или Boundschecker и выследите свою ошибку.

0 голосов
/ 12 февраля 2014

В прошлом я допустил ошибку в коде CString, из-за которой CString перестала работать корректно при передаче в качестве параметров. Ваша проблема может быть совершенно другой, но я объясню здесь, что я сделал, чтобы вызвать проблему, поскольку она может кому-то помочь.

Моя CString содержала имя каталога. Чтобы немного его очистить, я проверил, был ли последний символ '\', и если это так, я заменил его на '\ 0', напрямую перезаписав символ внутри строки CString.

Это, вероятно, каким-то образом разрушило целостность CString, создав несоответствие между длиной строки, измеряемой такими вещами, как strlen (), и фактическим размером буфера. Мое объяснение проблемы может быть неверным, но, по-моему, оно сводится к тому, что я подрываю целостность CString.

Я исправил свою проблему, заменив свое утверждение чем-то вроде имя_директории = dirname.Left (dirname.GetLength () - 1);

Я пишу это по памяти и не часто использую функции, так что извините, если я вспомнил неправильное имя функции. В любом случае, я рекомендую не записывать нулевые символы в середину строки CString, чтобы сократить ее, и искать это (среди прочего), если возникает проблема с CStrings в качестве параметров.

Ах, да, я думаю, что проблема может быть вашей. Если вы укорачиваете строку, перезаписывая символ, то, возможно, GetLength () вернет старое значение, которое больше, чем вы могли ожидать.

Моя настоящая проблема заключалась в том, что dir + "\" + имя файла не работало. Я предполагаю, что это конкатенация строк, содержащих нуль, и что окончательное значение было просто частью каталога, поскольку именно там был добавлен ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...