我正在一个遗留代码库中工作,其中包含大量使用手动保留/释放编写的 Objective-C++。内存使用大量 C++ 进行管理,并在调用包含对象的std::shared_ptr<NSMyCoolObjectiveCPointer>
构造时传入了一个合适的删除器。release
这似乎很好用;但是,当启用 UBSan 时,它会抱怨指针未对齐,通常是在取消引用 shared_ptrs 以执行某些工作时。
我已经搜索了线索和/或解决方案,但是很难找到有关 Objective-C 对象指针来龙去脉的技术讨论,更难找到有关 Objective-C++ 的任何讨论,所以我在这里。
这是一个完整的 Objective-C++ 程序,它演示了我的问题。当我使用 UBSan 在我的 Macbook 上运行此程序时,我在以下位置遇到了一个未对齐的指针问题shared_ptr::operator*
:
#import <Foundation/Foundation.h>
#import <memory>
class DateImpl {
public:
DateImpl(NSDate* date) : _date{[date retain], [](NSDate* date) { [date release]; }} {}
NSString* description() const { return [&*_date description]; }
private:
std::shared_ptr<NSDate> _date;
};
int main(int argc, const char * argv[]) {
@autoreleasepool {
DateImpl date{[NSDate distantPast]};
NSLog(@"%@", date.description());
return 0;
}
}
我在电话中得到了这个DateImpl::description
:
runtime error: reference binding to misaligned address 0xe2b7fda734fc266f for type 'std::__1::shared_ptr<NSDate>::element_type' (aka 'NSDate'), which requires 8 byte alignment
0xe2b7fda734fc266f: note: pointer points here
<memory cannot be printed>
我怀疑使用&*
to “cast” shared_ptr<NSDate>
to an 有问题NSDate*
。我想我可以通过使用.get()
shared_ptr 来解决这个问题,但我真的很好奇发生了什么。感谢您的任何反馈或提示!