#include<iostream>
#include<set>
#include<stdlib.h>
using namespace std;
typedef set<short> pos;
typedef struct tree
{
pos first;
}tree;
class check
{
public:
pos last;
void check_set();
};
void check::check_set()
{
tree *root,p;
root=(tree*)malloc(sizeof(tree));
root->first.insert(2);//SEGMENTATION FAULT HERE WHY???
p.first.insert(3);//NO SEGMENTATION FAULT
}
int main()
{
check obj;
obj.check_set();
obj.last.insert(1);//NO ERROR HERE
return 0;
}
1
A
回答
4
使用new
,而不是malloc
分割故障。
malloc
只分配內存,它不會以任何方式對它進行初始化,也不會構造將存在於該內存中的對象。另一方面有new
構造了C++對象。因此,要獲得一個有效的tree
對象(用正確初始化first
成員),使用此:
root = new tree();
以後,當你想釋放對象,使用delete
:
delete root;
1
的問題是, root
不指向tree
,它指向一個大小爲tree
的已分配內存塊。然後嘗試在內部成員上執行set
操作時,該集合(具有其內部結構和精心修飾的指針)實際上不在那裏。
1
malloc
不調用構造函數,所以也不tree
的構造也不std::set
的構造曾經被調用和你想填充未構造std::set
。這就是爲什麼你會遇到段錯誤。
使用new
爲:
root=(tree*)malloc(sizeof(tree)); //only allocates memory
root = new (root) tree; //constructs the object in the memory pointed to by root.
//deallocation
root->~tree(); //call the destructor
free(root); //and then deallocate the memory
2
tree *root,p; root=(tree*)malloc(sizeof(tree)); root->first.insert(2);//SEGMENTATION FAULT HERE WHY??? p.first.insert(3);//NO SEGMENTATION FAULT
p被分配在堆棧上:作爲
root = new tree(); //this allocates memory, and constructs the object as well.
//deallocation
delete root; //call the destructor, and then deallocate the memory
還是使用投放新!所以它的構造函數被調用。另一方面,根的構造函數是永遠不會調用!你只是分配一個樹需要的大小的內存!
相關問題
- 1. 的jQuery得到一棵樹
- 2. 這棵樹佈局爲什麼給我一個無限循環?
- 3. 當我試圖插入數據到表中,得到錯誤
- 4. 試圖走一棵樹,總是得不到結果
- 5. 爲什麼我得到404錯誤試圖休息一下?
- 6. 爲什麼我不能在我的地圖中插入/插入?
- 7. 試圖插入一個地圖,我得到
- 8. 爲什麼我得到一個錯誤,當我嘗試git的承諾--amend
- 9. 得到一棵樹結構的孩子
- 10. 爲什麼我的單元測試試圖插入一個記錄,當我不問它?
- 11. 爲什麼我沒有得到20151231當輸入爲2.0151231E7F
- 12. 二叉搜索樹 - 複製一棵樹到另一棵樹
- 13. 爲什麼當我嘗試插入和1 = 1之前限制0,1我得到SQL錯誤?
- 14. 我想找到一棵樹是否是另一棵樹的子樹,並運行到ArrayList比較prolem
- 15. 我得到一個PHP錯誤,我無法得到爲什麼我得到它
- 16. 當我嘗試插入其中BLOB數據類型當我試圖執行INSERT語句,我得到了下面的錯誤,我得到一個錯誤
- 17. 爲什麼我得到重複的行插入?
- 18. 我得到Metadata.framework錯誤,當我嘗試導入圖像
- 19. 爲什麼我得到空數組,當我看到數據
- 20. TortoiseSVN給我一棵樹衝突
- 21. 我該如何創建一棵樹?
- 22. 爲什麼我得到空
- 23. 爲什麼我得到.UnauthorizedAccessException?
- 24. 爲什麼我得到IllegalFormatConversionException?
- 25. 爲什麼我得到System.IndexOutOfRangeException:EmpPassword
- 26. 爲什麼我得到linebreaks?
- 27. 爲什麼我得到flask.redirect
- 28. 爲什麼我得到零
- 29. 爲什麼我得到java.lang.ClassNotFoundException?
- 30. 爲什麼我得到System.Data.DataRow?