在构造函数 - 编译器错误中调用的成员变量的驱动器
Destructor of member variable called in constructor - compiler bug?
我在Visual Studio 2012上有问题。首先,SSCCE:
class CacheImpl
{
public:
float* m_cache;
CacheImpl()
{
m_cache=(float*)new float[1];
}
~CacheImpl()
{
delete [] m_cache;
}
};
class Image
{
public:
Image() {}
~Image() {}
};
static const Image g_tmpImg;
class Filter
{
public:
Filter() : m_img(Image())
//Filter() : m_img(g_tmpImg) // <-- This variant works
{
//Empty
}
private:
CacheImpl m_cache;
const Image &m_img;
};
int main()
{
Filter f;
return 0;
}
在运行此操作时(以调试模式进行编译),我在Cacheimpl的删除上得到一个CRT断言,并查看filter()的汇编列表或在〜Cacheimpl()中设置一个断点()显示〜Cacheimpl()正在在过滤器构造函数的末端打电话给出了没有明显原因(实际上,这在VS2010中并没有发生)。而是为临时对象调用〜image(),vs2012 不 do。
在VS2012中编译此版本时,我会收到警告" C4413:'Filter :: M_img':参考成员的初始化为临时性,该临时性在构造函数退出后不持续不存在"。我理解这一点,但我希望有一个悬而未决的参考,而不是崩溃,因为错误的对象正在破坏。我是否偶然发现了编译器错误,还是应该接受它是不确定的行为而不是初始化对临时性的引用?对于上下文,在我的真实代码中,当使用这样的构造函数创建过滤器时,永远不会使用悬空参考。
有人可能会说这是一个编译器错误 - 但"未定义的行为"本质上意味着"任何事情都会发生",而您很快就将对对象的引用存储为不确定的行为有资格。因此,您应该接受这一点,并停止使用临时引用初始化参考。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 成员变量与函数概念检查