gpt4 book ai didi

c++ - 更新函数调用中的静态成员会导致崩溃

转载 作者:太空狗 更新时间:2023-10-29 11:39:23 26 4
gpt4 key购买 nike

我有一个 polymer 类,它有一个 static int count。当我创建一个新的 polymer 以添加到指针数组时,我使用 count 找到数组中的正确位置,然后更新 count 在构造函数中。在 Windows 中编译时它起作用了。但是,在 Linux (Ubuntu) 中编译时它会崩溃,除非我从构造函数中删除 count 的更新。

在 Windows 和 Ubuntu 中工作:

polymerPointer[polymer::count] = new polymer();
polymer::count++;

当构造函数不更新静态变量时(见下文)

polymer::polymer(){
//sets up lots of variables but doesn't update the static member
};

Ubuntu 中的崩溃(在 Windows 中工作):

polymerPointer[polymer::count] = new polymer();

当构造函数更新静态变量时(见下文)

polymer::polymer(){
//sets up lots of variables and then updates the static member
count++;
};

我可以重写代码,但我喜欢不必记得单独更新变量,这就是我将更新放在构造函数中的原因。对出了什么问题有什么想法吗?

最佳答案

你遇到了未定义的行为。

以下内容:

polymerPointer[polymer::count] = new polymer();
polymer::count++;

不等同于

polymerPointer[polymer::count] = new polymer();

其中 polymer() 递增 polymer::count

未定义的行为是由于您正在修改一个值并在同一语句中使用该值:

§1.9 p15 If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.

可能发生的是计数增加,然后对象被放置在数组中的新位置。现在代码将访问剩下的空白点,就好像它包含一个有效的指针一样,或者当您到达数组的末尾时,您可能会尝试将指针放在数组的边界之外。

将计数增量放在与实际插入数组的位置不同的位置是糟糕的设计。你应该做的是编写一个静态成员函数,将元素添加到数组并更新计数,然后使用它而不是手动创建对象并将其手动放置在数组中,同时期望计数自动更新。

class polymer {
static void create_new_polymer() {
polymerPointer[polymer::count] = new polymer();
count++;
}
};

更好的方法是只使用一个vector 并让它管理它自己的计数:

polymerPointer.push_back(new polymer());

关于c++ - 更新函数调用中的静态成员会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8885612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com