在C+;中声明节点时,何时需要使用新运算符+;? 在C++中创建一个节点时,什么时候需要使用新< /Cord>运算符来确保内存可以分配。

在C+;中声明节点时,何时需要使用新运算符+;? 在C++中创建一个节点时,什么时候需要使用新< /Cord>运算符来确保内存可以分配。,c++,C++,例如,当声明用于查找现有链表末尾的节点指针NewNode以便将节点添加到列表末尾时,此函数不使用new,但当实际将节点添加到列表末尾时,它使用new。这是因为节点指针被用作非动态内存分配,指向其他已动态分配的内存还是出于其他原因?在NewNode声明前面使用new(nothrow)是不正确的语法还是逻辑 typedef Node* NodePtr; /*a type definition for NodePtr for ease of use in `the larger program thi

例如,当声明用于查找现有链表末尾的节点指针NewNode以便将节点添加到列表末尾时,此函数不使用
new
,但当实际将节点添加到列表末尾时,它使用
new
。这是因为节点指针被用作非动态内存分配,指向其他已动态分配的内存还是出于其他原因?在NewNode声明前面使用new(nothrow)是不正确的语法还是逻辑

typedef Node* NodePtr; /*a type definition for NodePtr for ease of use in `the larger program this function is a part of*/`

void AddNode(char NewChar, NodePtr List)
{
    NodePtr NewNode = List;  //make NewNode point to List

    while (NewNode->Link != NULL)     //find end of linked list
        NewNode = NewNode->Link;

    NewNode->Link = new (nothrow) Node;  //create a new Node at the end of the list

    if (NewNode->Link == NULL)  //make sure Node was created
        return;

    NewNode = NewNode->Link;  //make NewNode point to the Node just created
    NewNode->Ch = NewChar;    //fill Ch part of NewNode
    NewNode->Link = NULL;     //make sure the list ends with NULL
}
void TestAddNode(NodePtr List)
{
    char NewChar;

    cout << "\n\n----------------   Testing AddNode   -------------------\n\n";

    cout << "Character to be added? ";
    NewChar = cin.get();
    cin.ignore();

    if (NewChar == '\n')  // User pressed just enter key.
    {
        cout << "Aborting AddNode...";
        return;
    }

    cout << NewChar;
    cout << " --  Adding \'" << NewChar << "\'";

    AddNode(NewChar, List);

    cout << "\n\nThe new list: ";
    ShowList(List); //show list is another function that outputs the list
}
typedef节点*NodePtr/*NodePtr的类型定义,便于在“该函数所属的较大程序”中使用*/`
void AddNode(char NewChar、NodePtr列表)
{
NodePtr NewNode=List;//使NewNode指向List
while(NewNode->Link!=NULL)//查找链表的结尾
NewNode=NewNode->Link;
NewNode->Link=new(nothrow)Node;//在列表末尾创建一个新节点
if(NewNode->Link==NULL)//确保已创建节点
返回;
NewNode=NewNode->Link;//使NewNode指向刚创建的节点
NewNode->Ch=NewChar;//填充NewNode的Ch部分
NewNode->Link=NULL;//确保列表以NULL结尾
}
无效TestAddNode(节点接受列表)
{
char-NewChar;

cout只有在动态分配新内存以存储新节点时,您才会使用
new
。在您的情况下,
NewNode
只是指向
List
所指向的现有内存,因此这不是使用
new
操作符的正确位置。

只有在动态分配所有节点时,您才会使用
new
为存储新节点定位新内存。在您的情况下,
NewNode
只是指向由
List
指向的现有内存,因此这不是使用
new
运算符的正确位置。

这通常不是一个好主意类型
typedef
是一种原始指针类型。它更简洁、更精确地表示为
*
符号或
Ptr
模板。使用
typedef
必须查找名称的定义。
NewNode
的名称有误导性。它既不是新节点,也不是指向新节点的指针。更好的名称应该是
p
,这只表明这是一个指针。更好的名称是应该是ListIterIt是一个局部自动变量,就像
int
变量一样,是的。在执行到达声明之前的某个地方为它保留了内存。通常这是在函数体的条目上,其中通常为所有自动局部变量保留内存。检查分配是否失败,然后just
return
,意味着如果分配失败,那么函数将不会默默地完成它的工作,并且没有任何东西可以指示它是否完成了工作。通过返回
bool
,函数可以向调用代码指示它是否成功。或者(更好)只需使用普通的
new
,无
nothrow
,在这种情况下,如果分配失败,将引发异常。它通常不是一个好主意类型
typedef
一个原始指针类型。它由
*
表示法或
Ptr
模板更简洁和精确地表示。使用
typedef
一has查找名称的定义。
NewNode
的名称有误导性。它既不是新节点,也不是指向新节点的指针。更好的名称应该是
p
,这只表明这是一个指针。更好的名称应该是ListIterIt是一个局部自动变量,就像
int
变量一样,是的。备注ry在执行到达声明之前的某个地方为其保留。通常这是在函数体的条目上,其中通常为所有自动局部变量保留内存。检查分配是否失败,然后只返回
,这意味着如果分配失败,则函数将不会自动运行完成了它的工作,没有任何东西可以表明它是否完成了。通过返回
bool
,函数可以向调用代码指示它是否成功。或者(更好)只使用普通
new
,no
nothrow
,在这种情况下,如果分配失败,将引发异常。