C++函数内指针赋值给本地变量是否属于未定义行为?关联MLIR报错
解答
指针赋值操作的未定义行为判定
你描述的指针拷贝、赋值操作本身不会触发未定义行为。
你操作的核心是复制mlir::Operation*类型的指针值(即目标对象的内存地址),而非拷贝mlir::Operation对象本身:
- 你提前通过
mlir::Operation* op = *op_itr;将迭代器指向的指针数值拷贝到了本地变量,后续删除candidates_的元素只是删除了容器内存储的这个指针数值副本,不会影响你已经拷贝出来的op变量的值 - 后续
schedulable_op_ = op;只是把这个内存地址再赋值给成员变量,全程没有涉及到mlir::Operation对象本身的修改或销毁
仅存在一种触发未定义行为的可能:后续其他逻辑销毁了该指针指向的mlir::Operation对象本身,此时你再解引用schedulable_op_才会出现非法访问问题。
mlir::Operation::~Operation()’ is private within this context报错解决
这个报错是MLIR的设计规则导致的:mlir::Operation类型的析构函数被声明为私有,禁止开发者手动管理mlir::Operation对象的生命周期,所有对象的创建、销毁都由MLIR框架自身托管。
你触发该报错的常见原因包括:
- 尝试定义栈上的
mlir::Operation实例,比如写了mlir::Operation op;这类代码 - 尝试对
mlir::Operation*指针调用delete手动释放对象 - 尝试用
std::unique_ptr、std::shared_ptr等智能指针直接托管mlir::Operation对象的生命周期
对应的修复规则:
- 所有
mlir::Operation实例的创建统一使用OpBuilder::create这类框架提供的工厂接口 - 不需要的
mlir::Operation对象调用框架提供的erase()方法标记销毁,不要手动调用delete - 禁止声明栈上的
mlir::Operation实例,所有实例都通过指针由框架托管生命周期
内容的提问来源于stack exchange,提问作者brewdogNA
相关产品推荐
相关产品推荐

