我有一段 C++ 测试代码在 Rstudio 中运行良好,它使用 g++,但会在 MSVS 2012 中导致运行时错误:
template<typename T>
struct vec{
T*head, *tail;
vec()
{
head=NULL;
tail=NULL;
}
vec(int n)
{
head=(T*)malloc(sizeof(T)*n);
tail=head+n;
}
T operator [] (int i) const {return *(head+i);}
T & operator [] (int i) {return *(head+i);}
~vec(){free(head);}
};
int main(){
std::vector<int>y(3);
y[0]=1; y[1]=2; y[2]=3;
vec<int>x1(3);
x1[0]=y[0];
std::cout<<"vec of integers, [] overloading works fine \n";
std::vector<std::vector<int>::iterator>z(3);
z[0]=y.begin();
z[1]=y.begin()+1;
z[2]=y.begin()+2;
vec<std::vector<int>::iterator>x2(3);
x2[0]=z[0];
std::cout<<*x2[0]<<"\n";
std::cout<<"vec of std::vector::iterator, [] overloading g++ works fine, MSVS doesn't \n";
return 1;
}
代码显示 vec 是否包含整数,MSVS 和 Rstudio 都可以正常工作;如果 vec 包含迭代器,MSVS 将遇到以下错误:
我感觉到它与迭代器有关。谁能让我知道我的错误在哪里?顺便说一句,我只在 MSVS 中包含了 vector 头文件。
谢谢!
最佳答案
VS 在 Debug模式下将额外的错误检查嵌入到其迭代器中。它在您的代码中发现了一个合法的错误!错误是您将未初始化的内存重新解释为已初始化的对象:
vec(int n){head=(T*)malloc(sizeof(T)*n);tail=head+n;}
^^^^^^^^^^^^^^^^^^^^^^^
T & operator [] (int i) {return *(head+i);}
^^^^^^^^^
x2[0]=z[0];
^^^^^^
赋值在 vector 迭代器对象上调用 operator=
,它实际上是未初始化的内存,当它试图将部分内存解释为有效数据时,会导致您看到的崩溃。 (顺便说一句,0xCDCDCDCD 是调试器通常用来填充未初始化内存的内容,以帮助更快地捕获此类错误。)
我建议使用 new
/delete
而不是 malloc。在 C++ 中很难正确分配原始内存(在 C++ 中,正常的内存管理已经足够困难了)。
还请注意,在一般情况下,malloc
可能不会为所有对象类型生成具有足够高对齐度的 block (尽管大多数情况下会这样,因为很少有对象对齐到超过 16字节)。
关于c++ - 自定义容器适用于 g++(Rstudio),不适用于 MSVS 2012,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36097512/