我有一个基类,它有一个指针,我还有两个派生类,它们被实现为堆栈分配和动态分配的存储空间,我需要从这些类中设置基类上的指针,对于第一种情况,指向堆栈分配存储空间的地址,对于第二种情况,指向动态分配的空间。
我的问题是针对堆栈分配的情况。
struct base { int *ptr; };
template<std::size_t N>
struct stack_allocator: base {
int arr[N];
};
struct dyn_allocator: base {
};
template<std::size_t N>
auto make_allocator(int (&arr)[N])
-> stack_allocator<N> // because of C++11
{
stack_allocator<N> res;
res.ptr = res.arr;
printf("addr inside: %p\n", res);
return res;
}
// using
int stack[32];
auto alloc = make_allocator(stack);
printf("addr outside: %p\n", alloc);
// will print the same address
我确实知道make_allocator()
可以只返回一个具有diff对象地址的副本,但至少在我的测试中和目前看来,地址是相同的。
为什么会发生这种情况?我怎么才能保证这种情况会继续发生?
1条答案
按热度按时间nwlqm0z11#
res
的地址与alloc
相同,可能是因为NRVO或其他优化。我不建议依赖这种行为。一个简单的方法是将
make_allocator
作为stack_allocator
的构造函数,或者向make_allocator
添加一个引用/指针参数来代替返回值。