【发布时间】:2023-03-20 10:15:01
【问题描述】:
例如vector<vector<string> > test。
g++,你可以做
test.reserve(10);
test[0] = othervector;
test[9] = othervector;
它不会崩溃。理论上说你不应该那样做,因为你将一个向量分配给一个相信它是一个向量的内存块。
但它就像下一个一样工作:
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<string> first_vector;
vector<string> &second_vector = *(vector<string>*)new char[sizeof(vector<string>)];
first_vector.push_back("whatever");
first_vector.push_back("whatever2");
first_vector.push_back("whatever3");
second_vector = first_vector;
cout << "0 " << second_vector[0] << " \n";
cout << "1 " << second_vector[1] << " \n";
cout << "2 " << second_vector[2] << " \n";
}
在我看来,这就像向量的赋值运算符实际上复制了向量实现的所有或至少足够的字段以使其正常工作,从而在未初始化的情况下呈现完全有效的向量。
嗯,这对我来说显然是未定义的行为,唯一的问题是它按预期工作,我在我目前正在检查的代码库中发现了很多这样的行为。
在其他容器中是否还有更多类似的情况?从来没有见过看起来那么容易犯错,但即使你犯了错误它也确实有效。
编辑:这不是关于如何正确地执行上述操作或抱怨编译器的行为,而是试图找到容易发生且以后很难发现的类似问题,例如这个。
【问题讨论】:
-
这里也按预期工作:没有输出。 :)
-
@UncleBens,你用的是什么编译器? g++-4.1.3 按预期输出这些字符串。
-
好吧,快讯:c++ 编译器并不能保护您免受错误的影响!这就像你开着车撞到墙上,活着出来,然后开始抱怨,因为你还没有死。 “我现在不应该死了吗?这个世界怎么了?”高兴就好,不要再这样做了。
-
天哪!各位看帖子了吗!!!!我没有抱怨什么!!!我试图找到类似的问题来查看这个代码库!
-
我正在使用 g++ 4.4.1 (MinGW)。我怀疑这是一种即使使用相同的编译器也可能无法获得一致结果的事情。也许分配的内存碰巧在正确的字节中包含零,这些零恰好代表一个有效的空向量/字符串? - 另外,你是说调试器也没有发现任何奇怪的东西?
标签: c++ memory memory-management vector variable-assignment