我有以下代码:
#include <iostream>
class A
{
public:
static void* operator new(std::size_t sz) throw();
static void operator delete(void* ptr);
static A obja[2];
static int i;
void show()
{
std::cout << "Called Show" << std::endl;
}
A(const char * where)
{
std::cout << where << std::endl;
}
~A()
{
std::cout << "Called Destructor " << std::endl;
}
};
A A::obja[2] = {A("global1"),A("global2")};
int A::i = 0;
static void* A::operator new(std::size_t sz) throw()
{
std::cout << "Called new " << std::endl;
std::cout << "Addr of " << i << " " << &obja[i] << std::endl;
return &obja[i];
}
static void A::operator delete(void* ptr)
{
std::cout << "Called delete " << ptr << std::endl;
}
int main()
{
A::i = 0;
A * a1 = new A("local main 1");
std::cout << "Addr of a1 " << a1 << std::endl;
a1->show();
delete a1;
A::i = 1;
A * a2 = new A("local main 2");
std::cout << "Addr of a2 " << a2 << std::endl;
a1->show();
delete a2;
}
由于某些原因,我故意在代码中删除静态变量 - 我期望当程序终止全局/静态变量时,会发生破坏并且应该观察到分段错误(因为它们已经被解除分配) - 但程序成功终止:
$ c++ test3.cpp -std=c++11
$ ./a.exe
global1
global2
Called new
Addr of 0 0x408030
local main 1
Addr of a1 0x408030
Called Show
Called Destructor
Called delete 0x408030
Called new
Addr of 1 0x408031
local main 2
Addr of a2 0x408031
Called Show
Called Destructor
Called delete 0x408031
Called Destructor
Called Destructor
我们不应该在这里遇到分段错误 - 这是合法的吗?