代码之家  ›  专栏  ›  技术社区  ›  Ramadheer Singh

运算符“new”只返回一个类的非本地堆指针?

  •  1
  • Ramadheer Singh  · 技术社区  · 15 年前

    语言:C++

    平台:Windows Server 2003

    我有一个exe调用一个dll。

    编辑: (exe不做任何事情,它调用很少的全局函数来处理dll中与dll相关的所有事情。它没有明确 新的 任何DLL类)

    我分配( 新的 )的内存 甲类 在dll中,它返回一个 非本地堆指针 .

    我试着 新的 dll中的其他类(在dll中),“new”为它们返回有效的堆指针,仅 甲类 分配不当。

    我在Windows上,通过此函数调用验证堆:

    编辑:

     ClassA* pA = new ClassA(); 
    
     _CrtIsValidHeapPointer ( (const void *) pA )
    

    我很困惑为什么这只发生在 新的 -ing 甲类 没有其他班级?

    (所有本机代码)

    最后编辑:
    结果这是一个糟糕的建筑。不能让它在新的版本中复制…为此浪费了5天时间:“”(

    3 回复  |  直到 15 年前
        1
  •  2
  •   Ben Voigt    15 年前

    只从DLL中导出全局函数,只调用导出的函数和通过V表。您的问题只是尝试导出整个类所引起的众多问题中的一个。DLL与.so库不同。

    编辑:由于问题现在显示类没有被导出,但所有这些都是在单个dll中观察到的,这将提示其他可能的原因。

    返回的指针是否相同 new 正在测试,或者它可能是指向基子对象的指针?分配使用了吗 新的 new [] ?其中任何一个都可能导致指针指向堆块的中间而不是开始。

        2
  •  1
  •   Dean Harding    15 年前

    如果 Class A 重写 operator new 然后,该类的内存可以在C运行时的DLL副本中分配。这会导致 _CrtIsValidHeapPointer 归来 false -因为 你的 C运行时库的版本使用的堆与DLL中的堆不同。

    返回的值 _ crtisvalidheappointer(crtisvalidheappointer) 通常不可靠(当然,即使它可能返回真值,也不一定意味着你可以 使用 指针)。你为什么要这么做?

        3
  •  1
  •   bmargulies    15 年前

    也许这个类声明了自己的新操作员,从某个神秘的位置获取存储?

    例如,该课程的作者可能写过:

    class MyClass {
       public:
         void * operator new (size_t amt);
         void operator delete(void *);
    };
    

    然后他们的新接线员打败了你的新接线员。

    当可执行文件使用/md时,它或dll是用/mtd生成的。