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

将指针分配给指针数组中的索引 我有一个C++类,其中有一个动态分配的指向结构的指针数组。我有一个成员函数,通过将数组的索引分配给指向动态分配的结构实例的指针,向该数组“添加项”,c++,C++,我已经用sort\u arr=new node*[this->max\u items]初始化了sort\u arr 在我的赋值函数中,我有sort\u arr[this->num\u items]=item其中指针作为参数传递给节点*项 在此函数中,我可以使用(*sort_arr[I])访问成员变量。key_a(其中I是索引),但一旦添加了另一项,此引用将不再有效,并导致seg故障 指针是否被解除分配,如果是,是否可以防止这种情况 编辑:很抱歉这里的歧义。我试图从总体上而不是具体地理解这个问题(

我已经用
sort\u arr=new node*[this->max\u items]初始化了
sort\u arr

在我的赋值函数中,我有
sort\u arr[this->num\u items]=item
其中指针作为参数传递给
节点*项

在此函数中,我可以使用
(*sort_arr[I])访问成员变量。key_a
(其中I是索引),但一旦添加了另一项,此引用将不再有效,并导致seg故障

指针是否被解除分配,如果是,是否可以防止这种情况

编辑:很抱歉这里的歧义。我试图从总体上而不是具体地理解这个问题(以一种教学的方式)。我希望这是我的概念方法的问题。鉴于情况可能并非如此,以下是更多细节:

节点定义为
node**sort\u arr,然后由构造函数初始化为
sort\u arr=new node*[this->max\u items]。类的insert方法执行:
sort\u arr[this->num\u items]=item
,其中
节点*项
一起传递

似乎在“n1”之后插入了项目“n2”之后,“n1”不再可以通过引用
(*sort\u arr[num\u items])访问。键a
key_a
节点
结构的成员变量


编辑2
节点*项
在类外动态分配(在
函数中)。

确保
this->num\u items
以及
i
小于
this->max\u items
,大于
-1
,因为这可能是seg故障的原因。

如果动态数组不用于授课,请不要使用它。使用简单的命令并保存
std::vector
。它几乎可以处理所有可能出错的事情。尝试一下,看看是否还有seg故障。

您发布的代码看起来基本正确(如果不是做这类事情的最佳方法),但我无法说出什么是
key\u 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\u type
,而不是
some\u type*
),但不能返回指向本地值的指针。函数退出后,本地值不再有效。这通常会导致segfault。

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


我感谢大家的帮助,如果我让任何人发疯,试图找出问题所在,我很抱歉。

您需要提供更多信息。除非您显式地执行此操作,否则原始指针不会被删除。@Kyle S:您能再给我们看一点代码吗,即sort_arr的声明、它的初始化位置以及提供项的方法。。会很有帮助;-)为什么
(*sort\u arr[i])。按a键
而不是
sort\u arr[i]->按a键
?@Mark:我添加了一些详细信息。我意识到问题在于,一旦我将另一个指向结构的指针添加到指针数组中,如果没有seg错误,我就无法访问在它前面插入的结构(我相信这是一个一致的问题)。@Kyle:你可以在这里发布任意多的代码。以你自己的方式提问,作为一个文字问题,这无助于许多视觉思考者找到问题的根源。你能把你所有的代码复制到一个新的项目中,把代码剥离到最小的部分,重新处理这个问题,然后发布整个代码吗?从您所说的内容来看,示例代码似乎与构造函数、插入方法、索引方法和带有两个插入和一个索引的
main
一样小,并且不会暴露任何“有趣”(专有)代码。他正在添加/追加一项。我相信
this->num\u items
指的是数组中存储的项数,而不是长度;他正试图设置下一个可用指针