c 返回類的指標需要注意的問題

2021-10-07 19:02:43 字數 1340 閱讀 8719

問題是在刷劍指 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 求導困難...