c++ - 自定义容器适用于 g++(Rstudio),不适用于 MSVS 2012

标签 c++ visual-studio rstudio

我有一段 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 将遇到以下错误:

enter image description here

我感觉到它与迭代器有关。谁能让我知道我的错误在哪里?顺便说一句,我只在 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/

相关文章:

R-Shiny 使用 Reactive renderUI 值

c++ - 循环递归函数c++

c# - 从 COM TLB 创建头文件

c++ - 在 Visual Studio C++ 2008 中链接库 (.lib) 和 (.dll)

c++ - 在 C++/VS2012 中初始化 OpenSSL 库使我的应用程序崩溃 :(

docker - 在 Rocker/verse 上使用 rstan 构建 Docker 镜像

formatting - 复制/粘贴到 Word 时如何保留 rstudio 的格式?

c++ - 如何将 const uint8_t* 转换为 char*

c++ - 为iOS生成AWS-SDK-CPP时在cmake上损坏的CXX编译器错误

C++链表在删除具有重复值的节点时会出现段错误