Приветсвую всех!!!!!!!
нужна помощь вот в такой проблемке:
допустим, функцию вида
CString GetSomeString()
{
CString str("bla bla bla");
return str;
}
я запихнул в dll (линкуется динамически).
в основном коде примерно так
{
...
CString s = GetSomeString();
}// вот тут-то в дуструкторе и падает
Падает при освобождении массива m_pchData — толи он уничтожен уже, толи не валиден.
Может, какой-то непорядок с подсчетом ссылок? Пытался вставлять всякие там Lock/UnlockBuffer(), ничего не выходит.
Или может как-то надо библиотеку поднастроить?
Проблема в том, что что память под твою строку выделяется в dll, а освобождается в основном приложении. Подробнее про это можно почитать у Рихтера, кое-что есть в этой статье
В качестве затычки попробуй выставь у обоих проектов одинаковые run-time library. Если используешь VC6, то это Project->settings->C/C++ ->code generation->use run-time library.
не рекомендую вам делать экспорт классов вообще, пользуйтесь простыми указателями или хендлами при экспорте из динамических библиотек, либо как вариант статической линковкой кода.
Здравствуйте, rikkitikkitavi, Вы писали:
R>нужна помощь вот в такой проблемке: R>допустим, функцию вида R>CString GetSomeString() R>{ R> CString str("bla bla bla");
Ошибка в предыдущей строке. Вообще-то, надо
static CString str("bla bla bla");
R> return str;
Вы возвращаете адрес локальной переменной, которая лежит в стеке.
После завершения функции ее стек разрушается. И какой адрес Вы
хотите получить?
R>} R>я запихнул в dll (линкуется динамически). R>в основном коде примерно так R>{ R> ... R> CString s = GetSomeString(); R>}// вот тут-то в дуструкторе и падает R>Падает при освобождении массива m_pchData — толи он уничтожен уже, толи не валиден. R>Может, какой-то непорядок с подсчетом ссылок? Пытался вставлять всякие там Lock/UnlockBuffer(), ничего не выходит.
Желаю успеха,
Никита.
Здравствуйте, nikita1, Вы писали:
N>Вы возвращаете адрес локальной переменной, которая лежит в стеке. N>После завершения функции ее стек разрушается. И какой адрес Вы N>хотите получить?
повторное создание класса, это совершенно нормально, обратие внимание в коде возвращаеться живой обьект, а не ссылка.
CString GetSomeString();
CString& GetSomeString(); // было бы ошибкой
Здравствуйте, nikita1, Вы писали:
N>Здравствуйте, rikkitikkitavi, Вы писали:
R>>нужна помощь вот в такой проблемке: R>>допустим, функцию вида R>>CString GetSomeString() R>>{ R>> CString str("bla bla bla"); N>Ошибка в предыдущей строке. Вообще-то, надо N>static CString str("bla bla bla");
R>> return str; N>Вы возвращаете адрес локальной переменной, которая лежит в стеке.
Где вы видите возврат "адреса локальной переменной". Возвращается КОПИЯ локальной переменной.
Адрес — это если бы было так:
CString *GetSomeString()
{
CString str("bla bla bla");
return &str;
}
Вот такое, действительно, работать не будет