2010-06-28 19 views
1

這段代碼不會產生一個錯誤:_bstr_t到字符指針和調用ATOF(...)

_bstr_t text=n.GetText(); 

atof((char*)text) 

如果文本是一個雙精度值。

我知道_bstr_t在轉換中產生了const char*;所以我不確定atof()是否會起作用?

+0

GetText是否返回一個BSTR?如果不是,那麼這是一個非常圓滑的方式。爲什麼不'LPCWSTR text = n.GetText();'並使用'_wtof(文本)',保存轉換?如果確實如此,然後你擁有了BSTR,那麼它是否正確地銷燬它?我不記得了,但我已經猜到了你需要使用括號構造函數或附件來做到這一點。 – Rup 2010-06-28 10:26:30

+0

GetText返回_bstr_t。 – 2010-06-28 10:31:17

回答

2

首先,_bstr_toperator char*() const,所以你不需要演員。然後,這個操作符調用ConvertBSTRToString(),它將在稍後返回一個你需要的堆分配字符數組(請參閱鏈接文章中的示例),否則將導致內存泄漏。最後,你應該知道_bstr_t可以封裝一個對應於空字符串的空指針,你的程序應該處理這種情況。

+1

但爲什麼轉換呢?爲什麼不在原始BSTR上使用'_wtof'? – Rup 2010-06-28 11:01:48

+0

我不介意。但無論如何檢查空BSTR是必要的。 – sharptooth 2010-06-28 11:24:12

+1

我很確定_bstr_t類用內部數據結構管理內存;你不應該自己解開記憶。 – Luke 2010-06-28 11:56:59

1

在我看來,使用_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