我的项目使用自定义分配器,它以下列方式构造对象:
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...);
}有一个类,包含作为字段的const引用:
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我认为construction字段(str_)应该包含与工程机械相同的地址,但显然不是这样。
为什么会发生这种情况,如何避免呢?
Ofc,我情不自禁地使用自定义分配器,这是强制性的,我不会问。
发布于 2017-04-03 16:05:01
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...);
}您所有的变量参数都将按值传递。因此,正在制作一份副本。您可能希望使用转发引用:
template <typename T, typename... Args>
T* create(Args&&... args)
{
auto memory = // request "bare" memory
// call object constructor
return new(memory) T(std::forward<Args>(args)...);
}指纹:
0x111ac20 0x111ac20
Demo
再次考虑数据对齐时,您想要使用的位置-新。
发布于 2017-04-03 16:05:51
打电话
A* a = create<A>(*str);创建*str的副本,并使用该副本调用函数,因为该函数声明为
template <typename T, typename... Args>
T* create(Args... args) {...}a有一个对一个对象的引用,该对象不再活着。
使用
template <typename T, typename... Args>
T* create(Args&&... args)
{
T* object = // request "bare" memory
// call object constructor
return new(reinterpret_cast<void*>(object)) T(std::forward<Args>(args)...));
}而不是。
https://stackoverflow.com/questions/43189185
复制相似问题