這段代碼不會產生一個錯誤:_bstr_t到字符指針和調用ATOF(...)
_bstr_t text=n.GetText();
atof((char*)text)
如果文本是一個雙精度值。
我知道_bstr_t
在轉換中產生了const char*
;所以我不確定atof()
是否會起作用?
這段代碼不會產生一個錯誤:_bstr_t到字符指針和調用ATOF(...)
_bstr_t text=n.GetText();
atof((char*)text)
如果文本是一個雙精度值。
我知道_bstr_t
在轉換中產生了const char*
;所以我不確定atof()
是否會起作用?
首先,_bstr_t
有operator char*() const
,所以你不需要演員。然後,這個操作符調用ConvertBSTRToString(),它將在稍後返回一個你需要的堆分配字符數組(請參閱鏈接文章中的示例),否則將導致內存泄漏。最後,你應該知道_bstr_t
可以封裝一個對應於空字符串的空指針,你的程序應該處理這種情況。
但爲什麼轉換呢?爲什麼不在原始BSTR上使用'_wtof'? – Rup 2010-06-28 11:01:48
我不介意。但無論如何檢查空BSTR是必要的。 – sharptooth 2010-06-28 11:24:12
我很確定_bstr_t類用內部數據結構管理內存;你不應該自己解開記憶。 – Luke 2010-06-28 11:56:59
在我看來,使用_wtof(text)
(請參閱http://msdn.microsoft.com/en-us/library/hc25t012.aspx)來完成您所需的轉換是絕對安全的。
@sharptooth:一般來說BSTR
數據不能總是以零結尾的字符串。但對應於_bstr_t
類的描述(參見http://msdn.microsoft.com/en-us/library/zthfhkd6.aspx):
A _bstr_t object encapsulates the BSTR data type. The class manages resource allocation and deallocation through function calls to SysAllocString and SysFreeString and other BSTR APIs when appropriate.
只有具有其它如SysAllocString
可以不是零封端SysAlloc函數分配的數據。函數SysAllocString
總是分配額外的兩個字節並用L'\ 0'填充。要閱讀更多關於此主題的信息,請參閱http://blogs.msdn.com/b/ericlippert/archive/2003/09/12/52976.aspx。
GetText是否返回一個BSTR?如果不是,那麼這是一個非常圓滑的方式。爲什麼不'LPCWSTR text = n.GetText();'並使用'_wtof(文本)',保存轉換?如果確實如此,然後你擁有了BSTR,那麼它是否正確地銷燬它?我不記得了,但我已經猜到了你需要使用括號構造函數或附件來做到這一點。 – Rup 2010-06-28 10:26:30
GetText返回_bstr_t。 – 2010-06-28 10:31:17