gpt4 book ai didi

c++ - 使用已定义结构的 vector 达到未初始化的内存

转载 作者:搜寻专家 更新时间:2023-10-31 00:35:16 24 4
gpt4 key购买 nike

我正在使用 vector 的长度和值构造函数创建我的位打包 vector 的 vector ,称为 xor_funcs。这是失败的测试:

TEST(vectorInit, size3) {
const xor_func temp{false, {0,0,0}};
vector<xor_func> arr{3, temp};
for(xor_func& f : arr) {
EXPECT_EQ(3, f.size()) << f;
}
for(int i = 0; i < 3; i++) {
ASSERT_EQ(3, arr[i].size()) << "for i=" << i;
arr[i].set(i);
}
}

似乎 size() 调用正在访问未初始化的内存,对于长度为 3 或更大的 vector ,但不是大小为 2 的 vector 。Valgrind 确认内存不是最近堆叠的, malloc'd 或 free'd。

xor_func 定义如下:

class xor_func {
private:
boost::dynamic_bitset<> bitset;
bool negated;
public:
xor_func(const bool neg, const std::initializer_list<int> lst);
// That's defined in cpp

xor_func(const size_t size) : bitset(size), negated(false) {}

// Disallow the trivial constructor, since I don't want
// any 0 length xor_funcs existing by default.
// xor_func() : bitset(), negated(false) {}

xor_func(const bool negated, const boost::dynamic_bitset<> bitset)
: bitset(bitset), negated(negated) {}
// That's all the constructors.

// Snip
}

我没有对默认的复制和移动构造函数执行任何操作。

发生了什么,为什么我的测试失败了?

最佳答案

正如 dyb 所说,vector<xor_func> arr{3, temp};被解释为 vector<xor_func> arr({xor_func{3}, temp}) , 作为 3可以转换成 xor_func由构造函数隐式调用,然后它可以选择要调用的构造函数的初始化列表版本。

如果你看Is C++11 Uniform Initialization a replacement for the old style syntax? ,你可以看到统一初始化语法的缺点之一就是这个错误。一个更简单的例子是

// std::string constructor prototype for reference
// fill (6)
string (size_t n, char c);

void main() {
string myString{65, 'B'};
cout << myString << endl;
}

这将打印出“AB”,而不是“BBBBBB...BBB”,因为它可以将 65 转换为“A”,然后就好像我们写了 myString{'A', 'B'} .要修复它,只需不要尝试为此调用使用统一的初始化语法并将其替换为

string myString(65, 'B');

我可以修复此错误的另一种方法是更改​​构造函数 xor_func(const size_t size)成为explicit xor_func(const size_t size) ,这会阻止编译器隐式转换 3xor_func .

哦,还有另一个很好的答案 What does the explicit keyword mean in C++ .

关于c++ - 使用已定义结构的 vector 达到未初始化的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24173097/

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