Этот код, не собирающийся произвести ошибку:
_bstr_t text=n.GetText();
atof((char*)text)
Где текст является двойным значением.
Я знаю что _bstr_t
производит a const char*
в преобразовании; таким образом, я не уверен если atof()
движение должно работать?
Во-первых, _bstr_t
имеет оператор char*() const
, поэтому приведение не нужно. Затем этот оператор вызывает ConvertBSTRToString(), который возвращает выделенный на куче массив char, который нужно удалить[]
позже (см. пример в статье по ссылке), если этого не сделать, произойдет утечка памяти. Наконец, вы должны знать, что _bstr_t
может инкапсулировать нулевой указатель, который соответствует пустой строке, и ваша программа должна обрабатывать такие ситуации.
Мне кажется абсолютно безопасным использовать _wtof(text)
(см. http://msdn.microsoft.com/en-us/library/hc25t012.aspx) для выполнения необходимого вам преобразования.
@sharptooth: В общем случае BSTR
данные не должны быть всегда нуль-терминированной строкой. Но это соответствует описанию класса _bstr_t
(см. http://msdn.microsoft.com/en-us/library/zthfhkd6.aspx):
Объект _bstr_t инкапсулирует тип данных BSTR тип данных. Класс управляет ресурсами распределением и деаллокацией через вызовы функций SysAllocString и SysFreeString и других API BSTR, когда это необходимо. когда это необходимо.
Только данные, выделенные с помощью SysAlloc-функций, таких как SysAllocString
, могут быть не нулевыми. Функция SysAllocString
всегда выделяет дополнительные два байта и заполняет их L'\0'. Для получения более подробной информации по этому вопросу я обращаюсь к http://blogs.msdn.com/b/ericlippert/archive/2003/09/12/52976.aspx.