删除静态成员变量时没有崩溃

时间:2017-08-28 08:14:58

标签: c++ c++11

我有以下代码:

#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

我们不应该在这里遇到分段错误 - 这是合法的吗?

0 个答案:

没有答案