我的项目使用构造对象通过以下方式自定义分配器:与常量引用可变参数模板
template <typename T, typename... Args>
T* create(Args... args)
{
T* object = // request "bare" memory
// call object constructor
return new(reinterpret_cast<void*>(object)) T(args...);
}
有一类,含常量引用作为一个字段:
struct A {
A(const string& s) : str_(s) {
cout << &s << '\n';
}
const string& str_;
};
但是,当我米试图创建一个对象,我得到错误的结果:
string* str = new string("some string");
cout << str << '\n';
A* a = create<A>(*str);
输出:
0x7fffc8004db4
0x7fffd5436050
我以为const引用字段(str_
)应该包含相同的地址,这已经给了施工机械,但显然这是不正确的。
为什么会发生,以及如何避免它?
Ofc,我不禁使用自定义分配器,这是强制性的,我不会问。
我请你原谅,也许我错过了一些东西......还有其他的关于比对的condiderations,而不是分配一个sizeof(T)'大小的内存块吗? 'sizeof'不报告已经对齐的大小? – Alexey