"int *a = new int" 和 "int *a = new int()" 之间有什么区别?

12 浏览
0 Comments

"int *a = new int" 和 "int *a = new int()" 之间有什么区别?

以下两行代码有何区别?

int *a = new int;

int *a = new int();

0
0 Comments

问题出现的原因是因为使用不同的方式来初始化动态分配的int指针会导致不同的结果。第一种方式是使用new int来进行默认初始化,对于内置类型如int来说,默认初始化不会执行任何初始化操作。第二种方式是使用new int()进行值初始化,对于int来说,值初始化意味着进行零初始化,给它赋值0。

要解决这个问题,可以根据具体需求选择使用哪种初始化方式。如果不需要对动态分配的int进行初始化操作,可以使用第一种方式,即new int。如果希望将动态分配的int初始化为0,可以使用第二种方式,即new int()。

以下是示例代码,展示了两种初始化方式的区别:

#include 
int main() {
    int *a = new int;
    std::cout << *a << std::endl;  // Output: Some random value
    int *b = new int();
    std::cout << *b << std::endl;  // Output: 0
    delete a;
    delete b;
    return 0;
}

在上面的代码中,首先使用第一种方式初始化了一个int指针a,并输出了它的值。由于默认初始化不执行任何操作,所以a的值是随机的。

然后使用第二种方式初始化了一个int指针b,并输出了它的值。由于值初始化会进行零初始化,所以b的值为0。

最后记得释放动态分配的内存,使用delete操作符将指针a和b所指向的内存空间释放掉。

通过选择合适的初始化方式,可以确保动态分配的int指针被正确地初始化,从而避免产生不确定的结果。

0
0 Comments

问题的出现原因是C++中的动态内存分配的两种方式new int;new int();在初始化对象时有不同的行为。前者是默认初始化,后者是值初始化,即0初始化。这种差异可能会导致在测试程序时无法暴露出来,因为动态分配的内存在简单的测试程序中通常会以0的形式出现,只有在更大的程序中,当先前的内存被重用时,才会包含“垃圾”值。

解决方法是根据实际需求选择适当的初始化方式。如果需要默认初始化,可以使用new int;;如果需要值初始化,可以使用new int();

C++11标准的第8.5节第7、5和6小节分别规定了值初始化、零初始化和默认初始化的情况。但是,根据该问题的具体情况,这些规定可能并不重要。

总之,了解动态内存分配时使用不同初始化方式的差异,并根据实际需求选择合适的方式,可以避免出现意料之外的问题。

0