我從來沒有在我的代碼中呼叫free過,所以我不知道為什么會出現這個錯誤。
我撰寫了一個程式來查找數字的整數磁區。它作業得很好。然后我決定我想嘗試使用指向向量的指標,以避免std::vector<ints>在回圈的迭代之間不必要地復制我的 's。它編譯(使用 g -std=c 11 -o main main.cpp)。當我執行程式時,我收到以下錯誤訊息:
main(5629,0x115dcfe00) malloc: *** error for object 0x7ffed1c05a30: pointer being freed was not allocated
main(5629,0x115dcfe00) malloc: *** set a breakpoint in malloc_error_break to debug
為什么我會收到此錯誤?先感謝您。
這是我的代碼:
#include <stdexcept>
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using std::cout; using std::endl;
using std::vector;
typedef vector<int> ints;
void print_ints(vector<int>);
void print_ints_vec(vector<vector<int>>);
void int_part(int, vector<vector<int>>&);
int main()
{
vector<vector<int>> partition;
int_part(5, partition);
print_ints_vec(partition);
return 0;
}
void int_part(int sum, vector<vector<int>>& res)
{
vector<int> init_xs = vector<int>{sum};
vector<int>* xs = &init_xs; // POINTER INITIALIZED TO vector<int>
int current_sum = sum;
while (true)
{
current_sum = accumulate(xs->begin(), xs->end(), 0); //
if (current_sum == sum)
{
res.push_back(*xs); //
vector<int> next_xs;
vector<int>::iterator it = find(xs->begin(), xs->end(), 1); //
if (it == xs->begin()) return; //
copy(xs->begin(), it, back_inserter(next_xs)); //
next_xs[next_xs.size() - 1] -= 1; //
xs = &next_xs; // POINTER REASSIGNED TO ANOTHER vector<int>
}
else
{
int tail = xs->back(); //
int diff = sum - current_sum;
int m = std::min(tail, sum - tail);
int next_tail = current_sum m > sum ? diff : m;
xs->push_back(next_tail); //
}
}
}
void print_ints(ints v) // PRINT UTILITY
{
cout << "[ ";
for (const int& n : v) { cout << n << "; "; }
cout << "]" << endl;
}
void print_ints_vec(vector<ints> v) // PRINT UTILITY
{
cout << "[ \n";
for (const vector<int>& xs : v) { cout << " "; print_ints(xs); }
cout << "]" << endl;
}
uj5u.com熱心網友回復:
xs = &next_xs;
不好,因為next_xs它是一個區域變數,其生命周期在范圍結束時結束。在范圍結束后,取消參考xs是非法的,直到一個指向有效物件的指標被分配給它。
在這種情況下,您應該直接修改向量以避免復制。
void int_part(int sum, vector<vector<int>>& res)
{
vector<int> xs = vector<int>{sum};
int current_sum = sum;
while (true)
{
current_sum = accumulate(xs.begin(), xs.end(), 0); //
if (current_sum == sum)
{
res.push_back(xs); //
vector<int> next_xs;
vector<int>::iterator it = find(xs.begin(), xs.end(), 1); //
if (it == xs.begin()) return; //
xs.erase(it, xs.end());
xs[xs.size() - 1] -= 1; //
}
else
{
int tail = xs.back(); //
int diff = sum - current_sum;
int m = std::min(tail, sum - tail);
int next_tail = current_sum m > sum ? diff : m;
xs.push_back(next_tail); //
}
}
}
uj5u.com熱心網友回復:
if (current_sum == sum)
{
// ...
vector<int> next_xs;
正如您在此處看到的:next_xs在陳述句中if宣告。當if陳述句完成時,next_xs被銷毀。這就是本地宣告的物件在自動范圍內的作業方式。
xs = &next_xs;
指向該物件的指標保存在此處。緊接著if宣告結束,next_xs并被銷毀。
你最終得到一個指向被破壞物件的指標。隨后的代碼嘗試取消參考它,并訪問被破壞的物件。這會導致未定義的行為,這就是崩潰的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/486429.html
上一篇:我想在使用axios的反應js中使用api在下拉串列中顯示資料
下一篇:了解回傳指向陣列的指標的指標函式
