gpt4 book ai didi

c++ - 使用 std::distance 来初始化 const 成员有时会出错

转载 作者:行者123 更新时间:2023-11-30 01:45:44 25 4
gpt4 key购买 nike

我对刚刚遇到的一个错误感到有点困惑。我正在使用 Visual Studio 2015,但遇到了不一致的行为。我已经从它所在的项目中删除了代码并重新创建了行为,请允许我向您介绍代码:

template <typename Ty>
struct Simple_Array
{
Ty* data;
const size_t size;

Simple_Array(size_t size) :
size(size),
data(new Ty[size])
{
}

virtual ~Simple_Array() {
delete[] data;
}
};

如您所见,我在代码中对 c 数组使用了一个简单的包装器,我想将 c 数组用于自学目的,因此不使用 std::vector 或 std::array 之类的东西。在使用它时,我发现需要一个构造函数,该构造函数在任何其他容器上采用第一个和最后一个迭代器,因此我决定使用 std::distance(first, last) 来计算大小。

    template <class It>
Simple_Array(It first, It last) :
size(std::distance(first, last)),
data(new Ty[size])
{
for (int i = 0; first != last; ++first, ++i)
data[i] = *first;
}

现在,当我使用这个构造函数时,大小被初始化为非常大的值,例如 3435973836。为什么?这特别令人困惑,因为以下代码工作正常:

    template <class It>
Simple_Array(It first, It last) :
Simple_Array(std::distance(first, last))
{
for (int i = 0; first != last; ++first, ++i)
data[i] = *first;
}

为了测试这一点,我编写了以下主要函数:

int main() {
auto list = { 1, 2, 3, 4 };

try {
Simple_Array<int>(list.begin(), list.end());
}
catch (...) {
std::cout << "Failed." << std::endl;
}

std::cin.get();

return 0;
}

我看了一眼反汇编,但我还没有弄清楚问题是什么。好消息是因为我有一个解决方法我不需要对此的答案来继续我的项目,但我仍然真的很想知道这里出了什么问题。

我将整个文件粘贴在这里:pastebin.com/ebNrsLaB

最佳答案

哇!这是我有生以来第一次真正看到关于初始化顺序的臭名昭著的 gcc 警告。

特别是,类成员按照它们在您的类中定义的顺序进行初始化,而不是按照它们在构造函数初始化列表中列出的顺序进行初始化。由于您的 Ty* data; 是在 size 之前定义的,因此它在 size 设置为实际值之前被初始化(分配) - 使用来自未初始化大小的随机值。

要解决此问题,请确保在类中的数据之前定义大小。

关于c++ - 使用 std::distance 来初始化 const 成员有时会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34187248/

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