假设我有一个像这样的构造函数:
MyColor(uint8 vec[]) {
r = vec[0];
g = vec[1];
b = vec[2];
a = vec[3];
}
但我称之为(3个元素而不是4个):
uint8 tmp[] = {1,2,3};
MyColor c(tmp);
但现在vec[3]
未定义...将此值分配给a
是否安全?如果没有,那么检查是否设置了vec[3]
没有很好的解决方法吗?
答案 0 :(得分:19)
不,这不安全。它是标准定义的未定义行为。它可能会破坏整个应用程序或返回一个随机值。解决方法是将大小与其一起传递,或者使用vector
代替。
答案 1 :(得分:13)
不,这不安全。您正在读取尚未分配的内存,这是未定义的行为。根据月相的不同,您可能会或可能不会出现分段错误。
要“解决”它,请确保传入的数组始终具有正确的大小。在您的示例中,您可以这样做:
uint8 tmp[4] = {1,2,3};
MyColor c(tmp);
初始化程序不需要指定所创建的数组的所有元素,因此可以显式初始化前三个值。其余值将设置为零。
答案 2 :(得分:4)
不,这不安全。也许您想将坐标作为参数传递给构造函数并使用两个重载:
MyColor(uint8 a, uint8 b, uint8 c, uint8 d) {
stuff
}
MyColor(uint8 a, uint8 b, uint8 c) {
stuff
}
这样你可以同时使用
MyColor a(1, 2, 3);
MyColor b(1, 2, 3, 4);
答案 3 :(得分:3)
如果你不想使用矢量试试这个......
MyColor(uint8 (&vec)[3])
{
r = vec[0];
g = vec[1];
b = vec[2];
}
MyColor(uint8 (&vec)[4])
{
//...
}
uint8 a1[] = {1,2,3};
MyColor c1(a1);
uint8 a2[] = {1,2,3,4};
MyColor c2(a2);
uint8 a3[] = {1,2,3,4,5};
MyColor c3(a3); // error
您不必显式包含数组的大小,如果您尝试传递具有错误数量的元素的数组,则会生成编译错误,
答案 4 :(得分:2)
在C ++中,与在C中一样,在函数参数上,数组会衰减为指针。现在,根据函数的语义,您可以使用其他方法:
// explicit parameters (with or without default values):
mycolor( uint8_t r, uint8_t g, uint8_t b, uint8_t alpha = 255 );
// vector (can check length)
mycolor( std::vector<uint8_t> const & components );
// array by reference
mycolor( uint8_t (&components)[ 4 ] );
我的第一个方法是最干净的。
答案 5 :(得分:1)
不。这可能会导致段错误。
Billy3
答案 6 :(得分:1)
显示的行为未定义,可能会崩溃。
我建议使用vector,并使用vector :: at()调用访问元素。如果超出分配范围,那将抛出异常。确保在向量中保留足够的空间
答案 7 :(得分:0)
就像你在问一个在湖顶建房子是否安全。有一天,你可能会在水中醒来。
在您的情况下,您可能会发现悬挂指针可能导致系统不稳定和频繁崩溃。
如果你知道什么是悬空指针,你现在面临的风险是什么。