2014-10-28 63 views
1

我已经创建了一个binarysearchtree,并有一个问题,关于如何检查是否有没有足够的内存来创建新节点。我知道它与调用构造函数有关,但我并不真正了解如何或与内存有什么关系。任何帮助或指导都将非常感激。二叉搜索树(如何检查插入时是否内存不足)

bool BinarySearchTree::treeInsert(string firstname, string lastname, string phonenumber) 
{ 
//code to check if memory is full (what i need help on) 
//code to insert 
} 
+2

只需创建节点即可。如果没有任何内存,则创建失败,抛出异常。这是由你自己决定的,因为你不会因为预期存在足够的内存而弄乱或变异树。 – PaulMcKenzie 2014-10-28 20:14:53

+1

只要让操作员抛出它的'bad_aloc',并让你的程序死亡,除非你有一个很好的方法来修复它(比,赶上std :: bad_alloc或使用新的nothrow) – 2014-10-28 20:17:40

+0

我怀疑这是一项家庭作业,还有更多的背景没有向我们展示。 – Daniel 2014-10-28 20:31:34

回答

0

这里的假设是您要编写的程序不会导致使用比系统可用的资源更多的资源。每次向树中添加节点时(如果您计划内存问题时听起来很多,听起来很像),请不要进行必要的系统调用来检查资源,请考虑您可以采取哪些其他方法来防止发生这种情况。

评论中建议的异常处理是一个不错的选择。这里是一个链接描述是:

How can I check if there is enough heap memory available?

如果你一定要,你可以使用的sysconf如下图所示,但我会避免每次都做,也许做每1000次添加,并保持局部结果以便在您开始接近时参考并做出反应。

这里是一个开始你想找的:

#include <unistd> 

size_t getTotalSystemMemory() 
{ 
    long pages = sysconf(_SC_PHYS_PAGES); 
    long page_size = sysconf(_SC_PAGE_SIZE); 
    return pages * page_size; 
} 
2

要回答你的问题在一个通用的方法,你会做的分配和做任何函数调用可能throw之前的任何突变或改变在你的数据结构:

例如:

bool BinarySearchTree::treeInsert(string firstname, string lastname, string phonenumber) 
{ 
    TreeNode* newNode = new TreeNode(); 
    // any other functions that may throw 
    //... 
    // now do housekeeping to update tree 
} 

所以,换句话说,确保你有你的所有数据已经在之前设置您更新您的树。这是非常安全的,因为抛出的异常不会损害现有的树。您可以有一个简单的try/catch确认如果抛出异常,则无法创建该节点。

的错误(或更多累赘的)方式是这样的:

bool BinarySearchTree::treeInsert(string firstname, string lastname, string phonenumber) 
{ 
    // code that changes the internals of BinarySearchTree 
    // ... 
    // now create the node 
    TreeNode* newNode = new TreeNode(); 
} 

除非你有一个try/catch,做的树所做的更改回滚,你最终会破坏使用这种方法,如果树new或其他某些函数会引发异常。

+0

真棒,我想我明白我现在需要做什么。谢谢。 – robo 2014-10-28 20:36:23

+0

+1我完全同意这个答案。节点分配前端负载的唯一缺点是根本不能保证你需要*插入,直到你检测到这种情况。即1.分配,2.搜索,3.不需要插入,4.删除未使用的节点。即使在*不需要时,步骤1和步骤4也必须完成,因为不会插入节点不是理想的属性。一个合适的算法首先不会让你的树软管,直到你知道你*有*插入一个节点*和*成功分配了相同的。 – WhozCraig 2014-10-28 21:25:23

+0

@WhozCraig:理想情况下,treeInsert函数将能够使用从treeFind返回的引用,所以它不必重新实现它。然后找到插入引用并检查是否需要插入它将分配新的内存并继续。 – 2014-10-28 21:37:18