删除别名指针
Deleting an aliased pointer
这样做:
union{
int * integer;
char * character;
} u;
u.integer = new int;
delete u.character;
u.integer = new int[5];
delete [] u.character;
我假设如果这些类型中的任何一个都有非平凡析构函数,那么这将不起作用,但是这样可以吗?
在任何情况下都不起作用,如果我们假设工作意味着具有良好定义的行为,而不是看起来工作(即不崩溃)
不,无论项是否具有普通析构函数,这都是未定义行为。如果析构函数是微不足道的,它可能看起来"工作",而实际上它正在泄漏内存,等等。
我要说这是介于实现定义和未定义之间的。
5.3.5/2: "在第一个备选项(删除对象)中delete的操作数可以是…指针指向由先前的new-expression创建的非数组对象... .
指针的值在你这样做的时候不会改变,所以这应该像预期的那样工作,提供sizeof(char*) == sizeof(int*)
。该特定比较的结果是实现定义的,如果假设为假,则行为是未定义的。
所以它真的真的不是特别安全。
很容易看出这是一个危险的错误。这两种类型可能具有完全不同且不兼容的内存分配和释放方式。这包括填充、垃圾收集、簿记、类特定的内存操作等。别这么做。
#include <cstddef>
#include <cstdlib>
#include <iostream>
using namespace std;
class A
{
public:
void* operator new (size_t size)
{
cout << "A::operator new (size_t)" << endl;
return malloc(size);
}
void* operator new [] (size_t size)
{
cout << "A::operator new [] (size_t)" << endl;
return malloc(size);
}
void operator delete (void* ptr)
{
cout << "A::operator delete (void*)" << endl;
free(ptr);
}
void operator delete [] (void* ptr)
{
cout << "A::operator delete [] (void*)" << endl;
free(ptr);
}
};
class B
{
public:
void* operator new (size_t size)
{
cout << "B::operator new (size_t) with some B-specific stuff" << endl;
return malloc(size);
}
void* operator new [] (size_t size)
{
cout << "B::operator new [] (size_t) with some B-specific stuff" << endl;
return malloc(size);
}
void operator delete (void* ptr)
{
cout << "B::operator delete (void*) with some B-specific stuff" << endl;
free(ptr);
}
void operator delete [] (void* ptr)
{
cout << "B::operator delete [] (void*) with some B-specific stuff" << endl;
free(ptr);
}
};
int main (int, char**)
{
union{
A* a;
B* b;
} u;
u.a = new A();
delete u.b;
u.a = new A[5];
delete [] u.b;
}
相关文章:
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 动态维度数组的 C++ 别名指针
- std::shared_ptr 使用别名构造函数,是否可以检索初始指针值?
- 类型别名允许分配任意指针,尽管 int* 是必需的
- 模板类函数指针类型别名
- 是否可以将引用类型别名与指针运算符一起使用来声明对指针的引用?
- 如何正确组合类型的别名,功能指针和模板功能
- 这是否仍然声明一种指针函数的别名?
- 将共享指针的别名构造函数与空共享指针一起使用C++
- 指针、常量和类型别名
- 在 C++ 中作为指针或别名进行内部编译的引用
- 使用指针转换来存储/转换值:我打破了严格的别名规则吗
- 如何为 noexcept 函数指针创建别名
- 取消引用类型的punned指针将打破严格的别名规则[-Wstrict aliasing]
- 从成员函数指针到另一个类型的强制转换,返回严格的别名问题
- 指针别名规则的应用(指向自身地址的指针)
- 将char[]强制转换为usingned int给出:取消引用类型的punned指针将打破严格的别名规则
- 删除别名指针
- 如何告诉C或C++编译器指针没有别名
- 指针容器的指针别名