Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不同节点的相同地址_C++_Nodes_Memory Address - Fatal编程技术网

C++ 不同节点的相同地址

C++ 不同节点的相同地址,c++,nodes,memory-address,C++,Nodes,Memory Address,我试着写一个双向列表。我必须使用重载运算符([]和+=)。[]-访问给定节点+=-将节点添加到我的列表中。我写了这些方法,看起来还可以,但它不起作用,我也不知道为什么 以下是我的代码的核心行: //******************************************************** CLista::CNode* CLista::operator[](int i_index) { int i_help = 0; CNode* c_result = &c_root

我试着写一个双向列表。我必须使用重载运算符([]和+=)。[]-访问给定节点+=-将节点添加到我的列表中。我写了这些方法,看起来还可以,但它不起作用,我也不知道为什么

以下是我的代码的核心行:

//********************************************************
CLista::CNode* CLista::operator[](int i_index)
{
int i_help = 0;
CNode* c_result = &c_root;
while(i_help < i_index)
{
    c_result = c_result->getNext();
    i_help++;
}
return c_result;
}
//*********************************************************
void CLista::operator+=(void* pv_object)
{
if(i_numNodes == 0)
{
    c_root = CNode(pv_object);
}
else
{
    CNode c_new = CNode(pv_object);
    CNode* c_help = this->operator[](i_numNodes - 1);
    c_new.setPrevious(c_help);
    (*c_help).setNext(&c_new);
}   
i_numNodes++;
 }

 int _tmain(int argc, _TCHAR* argv[])
 {
CLista list = CLista();
string s1 = string("first");
void* wsk1 = &s1;
string s2 = string("second");
void* wsk2 = &s2; 
string s3 = string("third");
void* wsk3 = &s3; 

list += wsk1;
list += wsk2;
list += wsk3;


void* res1 = (*list[0]).getObject();
void* res2 = (*list[1]).getObject();
void* res3 = (*list[2]).getObject();

cout << "res1: " << res1 << endl;
cout << "res2: " << res2 << endl;
cout << "res3: " << res3 << endl;

cout << "wsk1:" << wsk1 << endl;
cout << "wsk2:" << wsk2 << endl;
cout << "wsk3:" << wsk3 << endl;
   }

当我将第三个元素添加到列表中并检查它时,出现了一个奇怪的问题:res2和res3的地址是相同的

操作符+=
函数中,创建一个名为
c\u new
的本地
CNode
,链接到链接列表中。当作用域结束时(发生在函数返回之前),该局部变量将被销毁,使列表悬空(指向不再有效的
CNode
,其内存将被重新用于某些其他局部变量,例如下次调用函数时创建的下一个
c_new


在对象超出范围并被销毁后使用/访问对象是未定义的行为,因此通常会导致崩溃或行为异常。

您尝试过调试它吗?非常感谢!我将:CNode c_new=CNode(pv_对象)交换为CNode*c_new=new CNode(pv_对象),它可以工作。
class CLista
{
public:
    class CNode
    {
        public:
            CNode(void)
            {
                pc_next = NULL;
                pc_previous = NULL;
            }
            CNode(void* pv_object)
            {
                pc_next = NULL;
                pc_previous = NULL;
                this->pv_object = pv_object;
            }
            CNode* getNext(){return pc_next;};
            CNode* getPrevious(){return pc_previous;};
            void*  getObject(){return pv_object;};
            void setNext(CNode* pc_next);
            void setPrevious(CNode* pc_previous);
        private:
            CNode* pc_next;
            CNode* pc_previous;
            void*  pv_object; // czy to jest dobrze?
    };

    CNode c_root;
    int i_numNodes;

public:
    CLista(void);
    ~CLista(void);
    CNode* operator[](int index);
    void operator+=(void* object);

};