替换C++中的删除,信息缺失
Replacing delete in C++, missinformation
我正在尝试(并且已经解决)一个包含SSE优化成员的类的16字节对齐问题。但困扰我的是,我在网上发现的大部分例子都包含一行代码,对我来说,这行代码似乎完全多余,但在很多地方都在重复。
public:
void* operator new (size_t size)throw (std::bad_alloc)
{
void * p = _aligned_malloc(size, 16);
if (p == 0) throw std::bad_alloc();
return p;
}
void operator delete (void *p)
{
Camera* pC = static_cast<Camera*>(p);
_aligned_free(p);
}
有问题的线路是
Camera* pC = static_cast<Camera*>(p);
由于pC从未被引用,并且在函数结束时超出了范围,所以这样做有什么意义?我试着把这条线去掉,但它似乎没有任何区别,但这条线出现在很多例子中!我是不是遗漏了一些非常明显的东西,还是有一行异常的代码被盲目地从一个例子复制到另一个例子,并在许多"教程"中流行起来?
一旦进入析构函数,对象就会结束其生存期,因此您无法对该指针执行太多操作。Camera* pC = static_cast<Camera*>(p);
行可以安全地删除,它出现在教程中的唯一原因是,许多人只是在这里和那里复制并粘贴代码,而没有真正思考它是如何工作的。
delete()
的干净正确的代码如下所示:
void operator delete (void *p)
{
_aligned_free(p);
}
正如在对您的问题的许多评论中所讨论的,以下行确实是多余的:
Camera* pC = static_cast<Camera*>(p); // Just an unused variable
即使p
以前是Camera*
类型(其他可能是Canon*
、Sony*
、Nikon*
等子类),您仍然不能对pC
做太多操作,因为Camera::~Camera()
应该已经被调用了。之后调用CCD_ 10。
附言:我还没有遇到过这样的做法来将指针投射到特定的类,但如果你在教程中遇到这样的建议,那么你可能想更改它。
相关文章:
- 将数组的地址分配给变量并删除
- 正在查找文档以获得PS4平台的C++中的设备信息
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 提升信息解析器在读取/写入 INFO 格式文件时删除所有注释
- 由于删除 [] 知道数组大小,为什么此信息不可用
- C++删除或覆盖文件中的现有信息
- SIGSEGV 错误详细信息和删除步骤
- C++Pig拉丁代码,只删除文件信息
- 替换C++中的删除,信息缺失
- 是否可以根据另一个向量的信息从一个向量中删除某些元素
- 使用反向函数并从 txt 文件中删除一定数量信息的空格
- 使用条带是否删除二进制文件上的RTTI信息
- 如何从gSoap消息中删除xsi:type信息
- 关于隐式删除虚析构函数的错误信息是什么?
- 从Arduino以太网客户端Get中删除标头信息
- C++ 重新启动我的刽子手游戏时,我的分数以及我不想要的玩家信息被删除