gpt4 book ai didi

c++ - 了解在共享库中重载 operator new 的行为

转载 作者:太空狗 更新时间:2023-10-29 20:02:06 31 4
gpt4 key购买 nike

我正在 Centos 平台 [clang++、llvm3.9.0 和 libc++] 上开发一个共享库和应用程序,库和应用程序都重载了它们自己的 operator new 和 operator delete。

除 1 个案异常(exception),一切正常。在调用 std::string 的复制构造函数时总是调用应用程序端的operator new:

这是场景:

std::string str1 ( "A very strange issue on CentOS using clang and libc++" ); //operator new of library side called.

std::string str2(str1); //operator new of application side called. WHY??

operator delete 在这两种情况下都为库端调用。

以下是运行以下代码时的日志:

====================================================
operator new in shared library
operator new called Application side
operator delete in shared library
operator delete in shared library
====================================================

Shared Library端operator new和delete:

    void * operator new ( size_t len ) throw ( std::bad_alloc )
{
printf("operator new in shared library\n");
void * mem = malloc( len );
if ( (mem == 0) && (len != 0) ) throw std::bad_alloc();
return mem;
}

void * operator new[] ( size_t len ) throw ( std::bad_alloc )
{
printf("operator new[] in shared library\n");
void * mem = malloc( len );
if ( (mem == 0) && (len != 0) ) throw std::bad_alloc();
return mem;
}

void operator delete ( void * ptr ) throw()
{
printf("operator delete in shared library\n");
if ( ptr != 0 ) free ( ptr );
}

void operator delete[] ( void * ptr ) throw()
{
printf("operator delete[] in shared library\n");
if ( ptr != 0 ) free ( ptr );
}

应用端operator new和operator delete:

void * operator new ( size_t len ) throw ( std::bad_alloc )
{
void * mem = malloc ( len );
printf("operator new called Application side\n");
if ( (mem == 0) && (len != 0) ) throw std::bad_alloc();
return mem;
}

void * operator new[] ( size_t len ) throw ( std::bad_alloc )
{
void * mem = malloc ( len );
printf("operator new[] called Application side\n");
if ( (mem == 0) && (len != 0) ) throw std::bad_alloc();
return mem;
}

void operator delete ( void * ptr ) throw()
{
printf("operator delete[] called Application side\n");
if ( ptr != 0 )free ( ptr );
}

void operator delete[] ( void * ptr ) throw()
{
printf("operator delete[] called Application side\n");
if ( ptr != 0 ) free ( ptr );
}

请帮忙。

最佳答案

简短回答:不要那样做。

应该只有一个替代品 operator new(好吧,有很多风格,比如 noexcept[],等等,但每种口味只有一种)。

如果您有多个,那么 - 正如您所发现的那样 - 不清楚调用了哪个,并且您可能会收到对 new 和 delete 的不匹配调用,这是对未定义行为的快速访问。

我可以解释为什么您会得到您所报告的确切行为,但这与内联和外部模板有关,这并不重要。 operator new 有两个替换函数,这就是问题所在。

关于c++ - 了解在共享库中重载 operator new 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46771551/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com