Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定制容器与g+配合使用效果良好+;(Rstudio),对MSVS 2012不好 我有一段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; } 模板 结构向量{ T*头,*尾; vec() { head=NULL; tail=NULL; } vec(内部网络) { 水头=(T*)malloc(sizeof(T)*n); 尾部=头部+n; } T运算符[](int i)常量{return*(head+i);} T&运算符[](int i){return*(head+i);} ~vec(){free(head);} }; int main(){ 性病:向量(3); y[0]=1;y[1]=2;y[2]=3; vecx1(3); x1[0]=y[0]; std::cout_C++_Visual Studio_Rstudio - Fatal编程技术网

定制容器与g+配合使用效果良好+;(Rstudio),对MSVS 2012不好 我有一段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; } 模板 结构向量{ T*头,*尾; vec() { head=NULL; tail=NULL; } vec(内部网络) { 水头=(T*)malloc(sizeof(T)*n); 尾部=头部+n; } T运算符[](int i)常量{return*(head+i);} T&运算符[](int i){return*(head+i);} ~vec(){free(head);} }; int main(){ 性病:向量(3); y[0]=1;y[1]=2;y[2]=3; vecx1(3); x1[0]=y[0]; std::cout

定制容器与g+配合使用效果良好+;(Rstudio),对MSVS 2012不好 我有一段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; } 模板 结构向量{ T*头,*尾; vec() { head=NULL; tail=NULL; } vec(内部网络) { 水头=(T*)malloc(sizeof(T)*n); 尾部=头部+n; } T运算符[](int i)常量{return*(head+i);} T&运算符[](int i){return*(head+i);} ~vec(){free(head);} }; int main(){ 性病:向量(3); y[0]=1;y[1]=2;y[2]=3; vecx1(3); x1[0]=y[0]; std::cout,c++,visual-studio,rstudio,C++,Visual Studio,Rstudio,VS在调试模式下对其迭代器进行了额外的错误检查。它在您的代码中发现了一个合法的错误!错误是您将未初始化的内存重新解释为已初始化的对象: vec(int n){head=(T*)malloc(sizeof(T)*n);tail=head+n;} ^^^^^^^^^^^^^^^^^^^^^^^ T & operator [] (int i) {return *(head+i);} ^^^^^^^

VS在调试模式下对其迭代器进行了额外的错误检查。它在您的代码中发现了一个合法的错误!错误是您将未初始化的内存重新解释为已初始化的对象:

vec(int n){head=(T*)malloc(sizeof(T)*n);tail=head+n;}
                ^^^^^^^^^^^^^^^^^^^^^^^

T & operator [] (int i) {return *(head+i);}
                                ^^^^^^^^^

x2[0]=z[0];
^^^^^^
赋值调用向量迭代器对象上的
operator=
,该对象实际上是未初始化的内存,当它试图将部分内存解释为有效数据时,会导致崩溃。(顺便说一下,0xCDCDCD是调试器通常填充未初始化内存以帮助更快捕获此类错误的工具。)

我建议使用<代码>新< /COD> >代码>删除<代码>代替MALOC。原始内存分配很难在C++中正确使用(正常内存管理已经足够难了)。
还要注意的是,在一般情况下,
malloc
可能不会产生对所有对象类型具有足够高对齐度的块(尽管在大多数情况下会如此,因为很少有对象对齐超过16字节).

VS在调试模式下对其迭代器进行了额外的错误检查。它在代码中发现了一个合法的错误!错误是您将未初始化的内存重新解释为已初始化的对象:

vec(int n){head=(T*)malloc(sizeof(T)*n);tail=head+n;}
                ^^^^^^^^^^^^^^^^^^^^^^^

T & operator [] (int i) {return *(head+i);}
                                ^^^^^^^^^

x2[0]=z[0];
^^^^^^
赋值调用向量迭代器对象上的
operator=
,该对象实际上是未初始化的内存,当它试图将部分内存解释为有效数据时,会导致崩溃。(顺便说一下,0xCDCDCD是调试器通常填充未初始化内存以帮助更快捕获此类错误的工具。)

我建议使用<代码>新< /COD> >代码>删除<代码>代替MALOC。原始内存分配很难在C++中正确使用(正常内存管理已经足够难了)。 还要注意的是,在一般情况下,
malloc
可能不会产生对所有对象类型具有足够高对齐度的块(尽管在大多数情况下是这样的,因为很少有对象对齐超过16字节)。

您正在分配(未初始化)使用
malloc
并尝试将其解释为迭代器之类的非POD类型的内存。这注定会失败-
运算符=
,因为对象期望一个初始化对象作为其左操作数,但您给它一个垃圾值(因此崩溃)

另外,您没有调用元素的析构函数,因为您使用的是纯
free

一个简单的解决方案是在构造函数中使用
newt[n]
,而不是在析构函数中使用
malloc
(和
delete[]
)。这要求你的
T
是默认可构造的;有一些方法可以削弱这一要求(包括放置
new
和一些保证对齐的技巧)

顺便说一句,你的
vec
类既没有实现“三个规则”也没有实现“五个规则”,也没有禁用复制构造,因此如果你的vec对象被复制,你将有两个空闲。

你正在分配(未初始化)使用
malloc
并尝试将其解释为迭代器之类的非POD类型的内存。这注定会失败-
运算符=
,因为对象期望一个初始化对象作为其左操作数,但您给它一个垃圾值(因此崩溃)

另外,您没有调用元素的析构函数,因为您使用的是纯
free

一个简单的解决方案是在构造函数中使用
newt[n]
,而不是在析构函数中使用
malloc
(和
delete[]
)。这要求你的
T
是默认可构造的;有一些方法可以削弱这一要求(包括放置
new
和一些保证对齐的技巧)


顺便说一下,你的
vec
类既没有实现“三个规则”也没有实现“五个规则”,两者都不禁用复制构造,因此在您的vec对象被复制的情况下,您将有双重空闲。

请以文本而不是图像的形式发布错误消息。此外,缩进您的代码,因为它现在大部分是不可读的。调用堆栈是什么?您编写代码时假设
std::vector::iterator
是一个“微不足道”的东西对象,该对象可以由简单的
malloc
创建,而无需任何其他初始化。您的假设在一般情况下是不正确的。这正是您的代码在Visual Studio中失败的原因。在调试代码中,Visual Studio的迭代器是非平凡的对象,需要构造函数进行正确初始化。请以文本形式发布错误消息而且不是图像。另外,缩进您的代码,因为它现在大部分是不可读的。调用堆栈是什么?您编写代码时假设
std::vector::iterator
是一个“琐碎的”对象,该对象可以由简单的
malloc
创建,而无需任何额外初始化。您的假设在一般情况下是不正确的。这正是为什么您的代码在Visual Studio中失败的原因。在调试代码中,Visual Studio的迭代器是非平凡的对象,需要构造函数进行正确初始化。嘿,我们都看到了另一个di没有。不过我觉得你的答案更好。+1!嘿,我们都看到了对方没有看到的东西。不过我觉得你的答案更好。+1!