【问题标题】:Array is not being default initialized数组未默认初始化
【发布时间】:2014-11-30 00:53:57
【问题描述】:

在 Foo 类中,我有一个 Bar 类型的成员变量。 Bar 是在我的 Foo 构造函数中通过传入一个指向这样的数组的指针来构造的:

template<typename> T
class Foo{
Bar myBar;
size_t mySize;
size_t top;
Foo(size):myBar(new T[size]),mySize(size),top(0){}; //creates a Bar element of certain size
}

template<typename> T
class Bar{
T* myListPtr;
Bar::Bar(T* tPtr):myListPtr(tPtr){}  //stores a pointer to a T array
}

现在据我所知,如果 T 有一个默认构造函数,C++ 应该在数组中的所有元素上调用它。但是,当我输出指向的值时,我得到了一个这样的数组(size=8 和 T 类型 'double')

9.3218e-306
0
0
0
0
3.81522e-270
nan
nan

我如何确保所有值都是默认初始化的,而不仅仅是一些。该数组可能包含 char、double 等任何类型,但该类型将始终具有默认构造函数。什么可能导致这个问题?

【问题讨论】:

  • 请发帖MCVE。
  • 为什么你认为复制指向元素数组的指针时会复制任何元素?
  • @Chris 好吧,不,并非总是如此。而且没有“C/C++”这样的东西,所以请停止传播这个神话。干杯。
  • @Chris:C 不是 C++ 的子集。
  • 与其发布 cmets,不如花点时间准备一份 MCVE?否则,您无法期望您的问题得到很好的回答。

标签: c++ arrays templates initialization default-value


【解决方案1】:

现在据我所知,如果 T 有默认构造函数,C++ 应该在数组中的所有元素上调用它。但是,当我输出指向的值时,我得到了一个这样的数组(size=8 和 T 类型 'double')

您是正确的,如果存在,将使用默认构造函数。然而,像 double(和 int、float、char 等)这样的原始类型确实 not 有构造函数,无论是默认的还是其他的。尽管在许多情况下,该语言允许您使用相同语法的基本类型和类类型,但这是一个根本区别。

所以给定一个类MyClass 然后

MyClass myInstance;

将调用其默认构造函数。

但是给定一个双倍,那么

double myDouble;

不会以任何方式初始化它。

因此,像您在示例中所做的那样创建一个双精度数组不会初始化它们。

现在下一个合乎逻辑的问题是如何初始化它们。 This stackoverflow question 提供了答案,并提供了有价值的建议,即使用 std::vector 可以帮助避免原始数组经常遇到的一些问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 2015-02-25
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多