[英]What is happening? Three different types for the same stuff in four lines of code?
我從另一個關於碎片化的問題中借用了這個,但我並不為此煩惱。 我更擔心的是我根本不理解這個功能。 在類型和數據生命周期方面:(
相同的數據由std :: vector(具有內部元數據的動態aray類型),指向其中的字符串數據的指針(返回參數)和聲明的返回類型(std:string)表示。
問題:當std :: vector將被銷毀時,數據如何安全地從函數中移出? 它被隱式復制了嗎? 向量中的char的動態數組是否已從向量'分離'並作為std :: string類型返回,因此不需要批量復制? 有時,我認為C ++和std庫試圖讓我...
我已經使用C ++了一段時間,但像這樣的東西我的'ed in。
std::string TestFragmentation()
{
std::vector<char> buffer(500);
SomeCApiFunction( &buffer[0], buffer.size() ); // Sets buffer to null-terminated string data
return &buffer[0];
}
由std::vector
存儲的數據保證是連續的,因此&buffer[0]
會為您提供指向該數據開頭的原始指針。 1
std::string
有一個構造函數,它接受一個const char *
,它復制數據。 這是在return語句中隱式調用的(允許編譯器最多調用一次隱式轉換操作以避免編譯時錯誤)。
在這兩種情況下( vector
和string
),相應的后備緩沖區的內存由容器類管理,因此不存在內存泄漏或類似內容(只要原始C函數創建有效的null終止C風格的字符串並不會超出緩沖區范圍。)
但請注意,不能保證它會留在一個地方。 一旦你增長或縮小向量,它很可能會被復制到內存中的其他地方,使所有指向它的原始指針無效。 如果vector
本身被破壞,那么背景數據當然不再有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.