Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
向量索引器上的奇怪访问冲突 首先介绍了一些:我现在正在研究C++兼容的事情,这意味着能够使用不同的编译器选项来运行项目。因此,我使用一个发布DLL和一个链接到另一个项目的调试应用程序进行测试。 大多数问题都是在使用STL时出现的,所以我必须确保两个项目都只使用自己版本的STL。 这就是为什么我有一个包装类,它可以用std::vectors、std::list等构建,但只包含一个完全兼容的数组。现在,我可以将值包装在数组中,并在另一端将其解压为有效的STL对象_C++_Stl_Vector_Access Violation_Binary Compatibility - Fatal编程技术网

向量索引器上的奇怪访问冲突 首先介绍了一些:我现在正在研究C++兼容的事情,这意味着能够使用不同的编译器选项来运行项目。因此,我使用一个发布DLL和一个链接到另一个项目的调试应用程序进行测试。 大多数问题都是在使用STL时出现的,所以我必须确保两个项目都只使用自己版本的STL。 这就是为什么我有一个包装类,它可以用std::vectors、std::list等构建,但只包含一个完全兼容的数组。现在,我可以将值包装在数组中,并在另一端将其解压为有效的STL对象

向量索引器上的奇怪访问冲突 首先介绍了一些:我现在正在研究C++兼容的事情,这意味着能够使用不同的编译器选项来运行项目。因此,我使用一个发布DLL和一个链接到另一个项目的调试应用程序进行测试。 大多数问题都是在使用STL时出现的,所以我必须确保两个项目都只使用自己版本的STL。 这就是为什么我有一个包装类,它可以用std::vectors、std::list等构建,但只包含一个完全兼容的数组。现在,我可以将值包装在数组中,并在另一端将其解压为有效的STL对象,c++,stl,vector,access-violation,binary-compatibility,C++,Stl,Vector,Access Violation,Binary Compatibility,现在更接近问题:有些类包含STL,但也需要包装到数组中。因此,我还必须包装内部STL对象,这意味着添加一个标记并将其保存在关联的数组元素旁边 构建此包装器类完全没有问题,但解包时会在vector类中发生访问冲突: const_reference operator[](size_type _Pos) const { // subscript nonmutable sequence #if _HAS_ITERATOR_DEBUGGING if (size

现在更接近问题:有些类包含STL,但也需要包装到数组中。因此,我还必须包装内部STL对象,这意味着添加一个标记并将其保存在关联的数组元素旁边

构建此包装器类完全没有问题,但解包时会在vector类中发生访问冲突:

   const_reference operator[](size_type _Pos) const
        {   // subscript nonmutable sequence

 #if _HAS_ITERATOR_DEBUGGING
        if (size() <= _Pos)
            {
            _DEBUG_ERROR("vector subscript out of range");
            _SCL_SECURE_OUT_OF_RANGE;
            }
 #endif /* _HAS_ITERATOR_DEBUGGING */
        _SCL_SECURE_VALIDATE_RANGE(_Pos < size());

        return (*(_Myfirst + _Pos));  <---- HERE
        }
const\u参考运算符[](size\u type\u Pos)const
{//下标不可换序列
#如果_有_迭代器_调试

如果(大小()你真的需要两个版本的STL吗?我的意思是,你是在用两个不同的编译器和两个不同的STL实现构建这两个项目吗?当混合调试版本和发布版本时,问题通常来自两个不同的堆。然后,尝试释放分配在另一个模块中的内存会导致错误。如果如果您遇到这种情况,您可以尝试另一种方法——让两者使用相同的堆

如果您对这两个项目都有控制权,您可以从DLL导出分配器(以及匹配的deallocator),并在EXE中使用它。这样,内存管理将在单个堆上完成,构建类型将无关紧要。您可以在、向量/列表分配器等中使用它


这可能无法解决打包问题(到底是谁更改了打包设置?…),但当使用多个堆时,这是您想要的。

您真的需要两个版本的STL吗?我的意思是,您是否使用两个不同的编译器和两个不同的STL实现来构建这两个项目?当混合调试和发布版本时,问题通常来自两个不同的堆。然后,尝试释放内存在另一个模块中分配,将导致错误。如果您遇到这种情况,您可以尝试另一种方法-让两者使用相同的堆

如果您对这两个项目都有控制权,您可以从DLL导出分配器(以及匹配的deallocator),并在EXE中使用它。这样,内存管理将在单个堆上完成,构建类型将无关紧要。您可以在、向量/列表分配器等中使用它


这可能无法解决打包问题(到底是谁更改了打包设置?…),但在使用多个堆时,这是您想要的。

不幸的是,我认为如果不使用相同的选项编译,就无法解决此问题。请参阅:有些事情您必须了解,但在对代码进行一些更改后,我能够使用此方法编译它。但它只是在一个简单的“重复”过程中开始崩溃RISH包装在我看不到问题的地方,如果这个概念适用于没有内部STL对象的例子。@ Marcel,为什么你认为数组与不同的打包选项兼容?通常它们是ARN。t@user396672不是吗?我相信数组保存在指针+i*对象大小的位置。我不知道为什么会这样无论是使用Release还是Debug,都应该不同。但我会立即检查。@Marcel,因为对象的大小可能不同。编译器会根据结构packing添加一些填充。不幸的是,我认为如果不使用相同的选项进行编译,就无法解决此问题。请参阅:有些事情您必须了解,但在我的代码中做了一些修改之后,我可以用这个方法编译它。但是它开始在一个简单的“递归包装”上崩溃。如果这个概念在没有内部STL对象的例子中工作,那么我根本就看不出问题。@ Marcel,为什么你认为数组与不同的打包选项兼容?通常是ARN。t@user396672不是吗?我相信数组保存在指针+i*对象大小的位置。我不知道为什么在使用Release或Debug时会有所不同。但我会马上检查它。@Marcel,因为对象的大小可能不同。编译器会根据结构packing添加一些填充是的,我真的需要两个版本不要担心我使用了两个堆,因为我找到了一种处理内存分配的方法。打包设置到底是什么意思?我谈到了编译器设置的差异,例如调试和发布中的差异,这使得很难一起编译。@Marcel Bonzelet我指的是数据对齐,可以使用,也可以使用switch.Ma确保他们是一样的-如果你不知道他们做什么,他们没有理由不(同样的)默认值。我在两个项目中都使用默认值。是的,我确实需要两个版本的STL。不要担心我使用了两个堆,因为我找到了一种处理内存分配的方法。打包设置到底是什么意思?我谈到了编译器设置的差异,例如调试和发布中的差异,这使得很难一起编译。@Marcel Bonzelet我指的是数据对齐,可以使用,也可以使用开关。确保它们是相同的-如果你不知道它们是做什么的,它们没有理由不具有(相同的)默认值。我在两个项目中都使用默认值。
template<class T>
struct mwContainerItem
{
    T m_element;
    void * m_tag;
};

template<class T>
class mwContainer
{
    STLList ToList()
    {
        STLList l;
        for(size_t i=0; i<m_size; ++i) <---- It crashes when accessing m_size
        {
            l.push_back(m_elements[i].m_element); <---- It also crashes when accessing m_elements
        }
        return l;
    }

    mwContainerItem<T>* m_elements;
    size_t m_size;
};