在測試我的C++ 11代碼時,我遇到了一個錯誤,它的起源並不明確。我已經設法在下面的設計程序中重現錯誤。爲什麼從方法返回時本地變量中的數據損壞?
#include <iostream>
class Vector {
public:
double* data;
Vector(int n) {data = new double[n];};
~Vector() {delete[] data;}
};
Vector someMethod() {
if (true) {
Vector mat {3};
if (true) {
mat.data[0] = 0.1;
mat.data[1] = 0.2;
mat.data[2] = 0.3;
}
return mat;
}
}
int main() {
Vector mat { someMethod() };
std::cout << mat.data[0] << std::endl;
std::cout << mat.data[1] << std::endl;
std::cout << mat.data[2] << std::endl;
return 0;
}
以下輸出是由程序產生:
0
0.2
0.3
*** Error in `./testy': double free or corruption (fasttop): 0x0000000001f75010 ***
Aborted (core dumped)
而輸出應爲:
0.1
0.2
0.3
看來,所述第一值被破壞。我試用了不同的Vector長度,總是隻有第一個值被損壞。我沒有對上述行爲提出令人滿意的解釋。我懷疑這是因爲Vector對象是在if()語句處於someMethod()的塊範圍內的語句塊範圍內聲明和初始化的。但我不明白爲什麼這應該是一個問題,如果的確如此。
編輯
這兩種解決方案提出,先上後下的3/5法則和0秒以下的規則,工作。謝謝!不過,我仍然對這種行爲發生的原因感到困惑。什麼機制導致該值被破壞?當我在主方法的開始定義Vector對象時調用默認移動構造函數時,默認實現會導致此行爲?
尋找所謂的「三定律」。你的代碼違反了這個基本的C++原則。 –
@UlrichEckhardt這是C++ 11中的_five_的規則(或規則)(在C++ 98中是三個)。在大多數情況下,零規則也是可取的。 – emlai
同意@zenith對兩個陳述。 –