【发布时间】:2015-12-09 19:21:40
【问题描述】:
我对刚刚遇到的错误感到有些困惑。我正在使用 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
【问题讨论】:
-
我回答了问题的原因。附带说明一下,您的第二个版本(带有委托构造函数的版本)实际上更好。
-
@SergeyA 是的,我同意你的观点。很高兴知道误解来自哪里!
标签: c++ arrays stl visual-studio-2015