【发布时间】:2015-03-16 12:43:02
【问题描述】:
按照这个答案https://stackoverflow.com/a/29074955/1098041
我有一种奇怪的行为。
在调试中我得到了预期的输出,但是在发布中(我在 Windows 上使用 mingw)我在 test 函数中得到了垃圾。
#include <iostream>
#include <initializer_list>
template <class T>
struct array
{
T *ptr;
size_t len;
array() { clear(); }
array( T *p, size_t l ) { assign(p,l); }
inline void clear() { ptr=nullptr; len=0; }
inline void assign( T *p, size_t l ) { ptr=p; len=l; }
inline T& operator[] ( size_t i ) const { return ptr[i]; }
};
template <class T>
inline array<const T> wrap( std::initializer_list<T> lst )
{ return array<const T>( lst.begin(), lst.size() ); }
void test( int a, int b, int c )
{
auto ar = wrap({a,b,c});
std::cout<< ar[1] << std::endl;
}
int main()
{
auto a = wrap({1,2,3});
std::cout<< a[2] << std::endl;
test(1,2,3);
}
调试输出:
3
3
发布中的输出:
3
2686868 // some garbage.
谁能向我解释调试/发布模式如何影响 initializer_list 底层数组的生命周期? 或者为这种行为提供一些其他解释。
【问题讨论】:
-
我最初创建了这个问题,因为我发现一个奇怪的行为与问题中链接的已接受答案相矛盾,我被要求提供一个最小示例来重现我的行为。我最初虽然这是一个单独的问题,但似乎这两个问题的答案是矛盾的。现在怎么办 ?请版主帮忙。
标签: c++ debugging release initializer-list