我有一个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;
,其中item
与node *item
一起传递。
似乎在“n1”之后插入项目“n2”后,无法通过引用(*sort_arr[num_items]).key_a
访问“n1”。 key_a
是node
结构的成员变量。
编辑2 :node *item
在课堂外动态分配(在main
函数中)。
答案 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_items
和i
小于this->max_items
且大于-1
,因为这可能是seg-fault的原因。
答案 2 :(得分:0)
如果不是用于演讲,请不要使用动态数组。使用简单并保存std::vector
。它几乎处理可能出错的一切。尝试使用它,看看是否还存在seg-fault。
答案 3 :(得分:0)
如上所述,代码似乎是正确的。该问题与引用的代码无关。我一直在调试一些内存泄漏,并删除了引用的项目,这反过来导致了问题(很明显,现在我看到了)。
感谢大家的帮助,如果我开车试图找出错误的人,我很抱歉。