2016-02-16 24 views
-3

我試圖清除矢量中的所有數據,但未使用memset更改其大小。但後矢量的memset操作大小變爲0。這裏是確切的代碼:向量上的memset正在使其大小爲0

std::vector<T> buckets[2]; 
MAX_BUCKET_SIZE=16; 

構造:

std::cout << "Actual size2 0 " << buckets[0].size() << std::endl; 
std::cout << "Actual size2 1 " << buckets[1].size() << std::endl; 
... 
... 
while (...){ 
    delete_data(current_bucket); 

    std::cout << "current bucket ** " << current_bucket << std::endl; 
    std::cout << "Actual size3 0 " << buckets[0].size() << std::endl; 
    std::cout << "Actual size3 1 " << buckets[1].size() << std::endl; 
} 

delete_data功能:

memset(&buckets[bucket_id], 0, sizeof(buckets[bucket_id])); 

buckets[0].resize(MAX_BUCKET_SIZE); 
std::cout << "Actual size0 " << buckets[0].size() << std::endl; 
buckets[1].resize(MAX_BUCKET_SIZE); 
std::cout << "Actual size1 " << buckets[1].size() << std::endl; 
在函數

輸出:

Actual size0 16 
Actual size1 16 
Actual size2 0 16 
Actual size2 1 16 
current bucket ** 1 
Actual size3 0 16 
Actual size3 1 0 
current bucket ** 0 
Actual size3 0 0 
Actual size3 1 0 
+3

所以你有*陣列的向量*?爲什麼在這個世界上......? – CinCout

+0

不要在向量上執行'memset',這是未定義的行爲。 –

+4

你'memset',即完全clobber,一個* object *,並且奇怪爲什麼會有奇怪的行爲? – DevSolar

回答

3

更不用說對非memsetPOD不確定的行爲,它看起來像你剛剛「成功」 memset -ing矢量的內部數據 - 這可能是指向執行或指針開始/結束底層數組。你沒有修改元素,並且你實際上丟失了它們(並泄漏了內存)。

你最有可能想爲基礎數組進行操作(靜止,T必須是POD):

memset(&buckets[bucket_id].front(), 0, buckets[bucked_id].size() * sizeof(T)); 

但是沒有人做這在C++,因爲有STL解決方案,如std::fill

std::fill(buckets[bucket_id].begin, buckets[bucket_id].end(), T{}); 

這將填滿陣列與默認構造T(可能是非POD)的副本。

另外請注意,sizeof(buckets[bucket_id])給你這個場合完全沒有意義的數字。

1

不這樣做。廢棄class實例的自動存儲可能會導致未定義的行爲。例如,我想象矢量元素的任何析構函數都不會被調用。

調用resize爲零將實現基本相同的事情。或者只是將buckets重新分配給std::vector<T>的新實例。

7

我試圖清除矢量中的所有數據,而不用使用memset更改其大小。

這不起作用,因爲它沒有注意到被填充的區域。應用它的方式也會在使用指針實現std::vector的情況下創建內存泄漏,因爲指針正被清零。

使用std::fill代替:

std::fill(buckets[0].begin(), buckets[0].end(), 0); 
+0

std ::填充填充矢量字節或嘗試使向量0中的每個元素?載體<對>的情況會發生什麼? – SS306

+1

@Sasidhar不,它不能在這麼低的水平上工作。你必須通過可轉換爲'std :: pair '的東西。 – LogicStuff

+0

@SasidharSanapala std :: fill需要你傳遞一些可以轉換成向量元素的東西。在int對的情況下,這可能是make_pair(0,0)。 – dasblinkenlight

1

你在一個類,它是不確定的行爲充其量做memset。你怎麼知道把對象使用的內存設置爲零對於對象是否合理?例如,如果向量存儲一個指向它包含的項的指針,那麼你已經將該指針設置爲null,從而導致內存泄漏。

如果你幸運的話,你會崩潰,如果你不幸,你不會。

+0

如果該類是隻有一個成員的非多態類型,則定義該行爲。 – Bathsheba

+0

@Bathsheba - 真的嗎?因此,如果我的類只包含一個'std :: shared_pointer',那麼將memset'內存設置爲零對我來說是安全的? – Sean

+0

這與UB在該特定成員的'memset「上有關。雖然我的意見很清楚,但請同意。 – Bathsheba

相關問題