aga*_*aga 3 c++ stdstring new-operator clang++ libc++
我正在使用Centos平台上的共享库和应用程序[clang ++,llvm3.9.0和libc ++],并且库和应用程序都会重载它们自己的operator new和operator delete.
除1例外,一切正常.在调用std :: string的copy构造函数时总是调用应用程序端的operator new:
这是senario:
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??
Run Code Online (Sandbox Code Playgroud)
对于库侧调用两种情况下的operator delete.
以下是运行以下代码时的日志:
====================================================
operator new in shared library
operator new called Application side
operator delete in shared library
operator delete in shared library
====================================================
Run Code Online (Sandbox Code Playgroud)
共享库侧操作员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 );
}
Run Code Online (Sandbox Code Playgroud)
应用程序端操作员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 );
}
Run Code Online (Sandbox Code Playgroud)
请帮忙.
简短的回答:不要这样做.
还有的只应该是一个替换operator new(OK,还有一堆的味道,喜欢noexcept,和[]等,但只有每一个味道).
如果您有多个,那么 - 正如您所发现的那样 - 不清楚哪个被调用,并且您可以获得对new和delete的不匹配调用,这是对未定义行为的快速访问.
我可以解释为什么你得到了你正在报告的确切行为,但它与内联模板和外部模板有关,而且它并不重要.你有两个替换功能operator new,这就是问题所在.
| 归档时间: |
|
| 查看次数: |
425 次 |
| 最近记录: |