簡體   English   中英

怎么了? 四行代碼中相同內容的三種不同類型?

[英]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語句中隱式調用的(允許編譯器最多調用一次隱式轉換操作以避免編譯時錯誤)。

在這兩種情況下( vectorstring ),相應的后備緩沖區的內存由容器類管理,因此不存在內存泄漏或類似內容(只要原始C函數創建有效的null終止C風格的字符串並不會超出緩沖區范圍。)


但請注意,不能保證它會留在一個地方。 一旦你增長或縮小向量,它很可能會被復制到內存中的其他地方,使所有指向它的原始指針無效。 如果vector本身被破壞,那么背景數據當然不再有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM