保存对象的攻击函数并稍后称呼它是明确定义的行为
Is it well defined behaviour to save a destructor adress of an object and call it later?
我目前正在使用C 编写的堆栈分配器。可以通过模板方法从此堆栈分配器中获取对象。一旦调用了另一种交易方法,应破坏这些对象。当实验不同的方法以实现灾难的调用时,我偶然发现了以下内容:
auto destructor = someObject->~SomeClass;
destructor();
灾难似乎被称为震源,但是这对我来说有点奇怪。我有以下问题:
- 这种定义明确的行为?
- 驱动器的类型是什么(我可以用什么替换自动关键字(?
- 我可以保存列表中不同类型的几个对象的所有驱动器地址并以后调用吗?
正如评论注释,这是未定义的行为/编译器扩展。
不过可以做您想做的事:
template<typename T>
std::function<void(T*)> defer_dtor()
{
return [](T* ptr) {ptr->~T();};
}
或直接(更像您的问题,但独特的lambda类型不能直接添加到列表中。(
auto destructor = [&]{someObject->~SomeClass();};
destructor();
注意:这遵循您的问题,并且不调用delete ptr
。这是否适当取决于上下文,但大概是您要包装delete ptr
,您只会使用std::shared_ptr
。
[编辑]我错过了您的问题:"保存列表中不同类型的几个对象的所有破坏性地址"。
这将是一个问题。确切地说,设计问题。这些类型如何相关?如果通过继承,您不需要驱动器列表,而需要virtual
驱动器。如果类型不相关,您如何匹配对象和保存的损坏器?如果您确实有所有这些对象的类型,为什么不直接调用->~Type()
?
我可以保存不同的几个对象的所有驱动器地址 列表中的类型并以后调用?
是。请注意,我的解决方案还将破坏对象的指针保留,而不仅仅是破坏对象。您可以做一些lambda魔术来实现这一点 一些低级帮助:
class GenericDestructor {
private:
const void* object;
void(*destructor)(const void*);
public:
template<class T>
GenericDestructor(const T& _object) noexcept :
object(std::addressof(_object)){
destructor = [](const void* _object) {
auto original = static_cast<const T*>(_object);
original->~T();
};
};
void operator () () noexcept {
destructor(object);
}
};
存储:
std::vector<GenericDestructor> storedDestructors;
auto needsToBeDeleted = new std::string();
storedDestructors.emplace_back(*needsToBeDeleted);
破坏所有存储的对象:
for(auto& storedDestructor : storedDestructors) storedDestructor();
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- vscode g++链路故障:体系结构x86_64的未定义符号
- 保存对象的攻击函数并稍后称呼它是明确定义的行为