2017-07-17 66 views
0

什麼是正確的方式來返回一個向量的底層緩衝區時沒有元素還在它(size() == 0)。我先撥打vector.reserve(),這樣就分配了內存。引用保留向量中的第一個元素

我試過以下,但它給出了不同的指針值,我期望是相同的值。從我用google搜索起來,似乎.front().data()size()爲零時未定義。我需要獲得一個指向vector的指針,以便我可以將它傳遞給C函數。

int main() { 
    std::unique_ptr<std::vector<int>> vec(new std::vector<int>(10)); 

    std::cout << std::hex 
       << (uint64_t)&vec.get()[0] << " " 
       << (uint64_t)&vec->front() << " " 
       << (uint64_t)vec->data() << std::endl; 
    return 0; 
} 

輸出:

2b324a4cec20 2b324a4cec40 2b324a4cec40

如果你運行GCC這個代碼,.data()返回0。然後,標準說front()未定義因爲size()是0 。你可以看到指針值不同。到底是怎麼回事?

ideone example to play with

+0

你有一個*指針*給vector的原因是什麼?通常不需要。 –

+2

這是不可能的,你只允許引用存在的元素。即使分配了存儲空間,data()函數也可能爲空向量返回空指針。 –

+0

這是用在一個非常複雜的情況下,我用自定義分配器使用矢量,並且矢量的初始化需要延遲,因爲它是一個成員變量(並且分配器不是默認可構造的)。 –

回答

0

閱讀這些意見,並經過Google上搜尋它似乎是不可能的,如果沒有大小()==調用未定義的行爲檢索一個向量(即使保留)的基礎緩衝區0

  • &操作[0]不能被稱爲,因爲它是爲UB空載體

  • 在(0)不能被稱爲&,因爲它是相同的操作符[](和不範圍檢查)

  • 。數據()不能被調用,因爲它保證只有 [數據(),數據()+大小)是一個有效的範圍,而不是該範圍不爲0

  • 開始
  • &前()不能,因爲它被稱爲是UB空載體

我個人的事,這是在語言錯誤。如果保留被調用,Data()應該返回一個指向矢量的指針

相關問題