1

对不起标题。下面的代码可能有助于描述问题。我已经开课了Student。如果这样做:

Student stu1(score, "sam",5, "aaa", "123dfkj@gmail.COM","156412", "518105" );
Student *tempSt = &stu1;

我尝试使用cout的字符串成员tempSt,它可以工作。但字符串成员在以下情况下变为空:

tempSt = &Student(score, "sam",6, "aaa", "123dfkj@QQ.COM","156412", "518105" );

怎么了?希望你能理解我糟糕的描述:)

更新:

问题源于此:

void myList::add(Student *a) {
slistNode *tempNode = new slistNode();
tempNode->data = a;

if(lastNode == NULL) {
    headNode = tempNode;
    lastNode = tempNode;
} else {
    lastNode->next = tempNode;
    lastNode = tempNode;
}

++listLength;

}

我尝试将这些 obj 放入一个列表中,所以我希望这些 obj 是临时的(实际上我希望它们没有名字)。我不想制作很多像 stu1、stu2、stu3 这样的 objs ......

slistNode 类:

class slistNode {
public:
slistNode() { 
    next = NULL;
}
Student *data;
slistNode *next;
};
4

2 回答 2

4

你得到一个指向临时对象的指针。此指针指向的对象将在代码到达下一行之前被破坏。由于对象被销毁,当然访问字符串成员会调用未定义的行为。

于 2013-06-26T07:55:21.807 回答
3

在第二种情况下,这是:

Student(score, "sam",6, "aaa", "123dfkj@QQ.COM","156412", "518105" );

构造一个临时对象。它在建造后立即被破坏。获取它的地址会调用未定义的行为

(如果你从 C 而不是 C++ 开始,编译器甚至不会允许你自杀。是的,在 C++ 中做出无脑的设计决策!)

于 2013-06-26T07:56:25.187 回答