将指针指向指针数组中的索引

时间:2011-02-12 07:52:58

标签: c++

我有一个C ++类,我有一个动态分配的结构指针数组。我有一个成员函数,通过将数组的索引分配给指向动态分配的结构实例的指针,将“添加项”添加到此数组中。

我已使用sort_arr初始化sort_arr = new node *[this->max_items];

在我的赋值函数中,我有sort_arr[this->num_items] = item;,其中指针作为node *item的参数传递。

在这个函数中,我能够使用(*sort_arr[i]).key_a(其中i是索引)访问成员变量,但是一旦添加了另一个项目,该引用就不再有效并导致seg错误。

指针是否已被释放,如果是,是否可以防止这种情况?

编辑:很抱歉这里含糊不清。我试图一般地理解这个问题,而不是特别地(以教学方式)。我希望这是我的概念方法的一个问题。鉴于它可能不是,这里有更多细节:

节点在类声明中定义为node **sort_arr;,然后由构造函数初始化为sort_arr = new node *[this->max_items];。该类的insert方法执行:sort_arr[this->num_items] = item;,其中itemnode *item一起传递。

似乎在“n1”之后插入项目“n2”后,无法通过引用(*sort_arr[num_items]).key_a访问“n1”。 key_anode结构的成员变量。

编辑2 node *item在课堂外动态分配(在main函数中)。

4 个答案:

答案 0 :(得分:2)

你发布的代码看起来基本上是正确的(如果不是最好的方式来做这种事情),但我不知道key_a是什么,或者你在调用它的上下文。因此,很难确切地说出问题所在。发布函数的整个部分可能很有用。

如果您(或您调用的某些代码)明确调用new,则通过delete分配的内容的唯一方法是取消分配。这几乎是动态内存分配的重点,允许你的对象在弹出堆栈框架后生效。

我对当前信息的最佳猜测是,您尝试访问从函数返回后在堆栈上分配的本地值。例如,这会导致问题:

some_type* some_function(int i)
{
    // ...
    some_type p = (*sort_arr[i]).key_a; // p is a copy of key_a, allocated on the stack
    // ...
    some_type* result = &p;
    return result;
}

在这种情况下,p可以直接返回(如果您将返回类型更改为some_type而不是some_type*),但是您无法返回指向本地价值。函数退出后,本地值不再有效。这通常会导致段错误。

答案 1 :(得分:0)

确保this->num_itemsi小于this->max_items且大于-1,因为这可能是seg-fault的原因。

答案 2 :(得分:0)

如果不是用于演讲,请不要使用动态数组。使用简单并保存std::vector。它几乎处理可能出错的一切。尝试使用它,看看是否还存在seg-fault。

答案 3 :(得分:0)

如上所述,代码似乎是正确的。该问题与引用的代码无关。我一直在调试一些内存泄漏,并删除了引用的项目,这反过来导致了问题(很明显,现在我看到了)。

感谢大家的帮助,如果我开车试图找出错误的人,我很抱歉。