問題是在刷劍指 offer時發現的
具體問題如下
定義了類treenode
struct treenode
};
遞迴實現由先序遍歷和中序遍歷構造二叉樹
問題出在構建類物件和返回指向類的指標上
line6 和 最後的return,構造過程中會出現記憶體溢位,訪問到不合法位置
treenode* reconstructbinarytree(vectorpre,vectorvin)
}root.left = reconstructbinarytree(vector(pre.begin() + 1, pre.begin() + f + 1),
vector(vin.begin(), vin.begin() + f));
root.right = reconstructbinarytree(vector(pre.begin() + f + 1, pre.end()),
vector(vin.begin() + f + 1, vin.end()));
return &root;
}
修改物件的構造方法後,正確執行
class solution
}root->left = reconstructbinarytree(vector(pre.begin() + 1, pre.begin() + f + 1),
vector(vin.begin(), vin.begin() + f));
root->right = reconstructbinarytree(vector(pre.begin() + f + 1, pre.end()),
vector(vin.begin() + f + 1, vin.end()));
return root;
}};
將構造方法變為new乙個返回指向物件指標的 treenode* 物件,修改訪問部分的**,正確執行
第一種方法造成錯誤的原因是因為treenode root(pre[0]);構造的root物件分配的棧型別的記憶體,在函式結束後就會釋放記憶體,這時仍然返回指向這個棧的位址,但是這個棧中的資料已經釋放,會造成指向不合法的物件。
第二種方法,new乙個物件,分配的是堆型別的記憶體
從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。在我們delete釋放記憶體前,會一直在程式執行過程中存在,所以是合法的。
C 類需要注意的問題(一)
可以同時建立多個物件class circle intmain 用circle類建立了10個這種型別的圓,相當於陣列。可以建立指標 include using namespace std class circle void area intmain 程式測試可用。指標物件pcircle指向了已經建立了...
c c 使用指標需要注意的問題
分配空間 初始化 釋放 二 常見的錯誤有幾種 1 記憶體分配未成功,卻使用了它 程式設計新手常犯這種錯誤,因為他們沒有意識到記憶體分配會不成功。常用解決辦法是,使用記憶體之前檢查指標是否為null。如果指標p是函式的引數,那麼在函式的入口處用assert p null 進行檢查。如果使用malloc...
需要注意的問題
決策樹id3和c4.5的差別?各自優點?boost演算法 cart 回歸樹用平方誤差最小化準則,分類樹用基尼指數最小化準則 gbdt與隨機森林演算法的原理以及區別。優化演算法中常遇到的kkt條件?作用是?最近鄰演算法knn 分類與回歸 l1和l2函式?l1和l2正則項的比較,如何解決 l1 求導困難...