正确初始化指针的方法

时间:2016-01-04 03:24:05

标签: c++

分配内存后初始化指针的最佳方法是什么。 我的选择:

1:

# Default system properties included when running spark-submit.
# This is useful for setting default environmental settings.

# Example:
# spark.master                     spark://master:7077
# spark.eventLog.enabled           true
# spark.eventLog.dir               hdfs://namenode:8021/directory
# spark.serializer                 org.apache.spark.serializer.KryoSerializer
# spark.driver.memory              5g
# spark.executor.extraJavaOptions  -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
#
spark.master            yarn-client
spark.serializer        org.apache.spark.serializer.KryoSerializer
spark.driver.memory             100G
spark.executor.memory           14G 
spark.sql.parquet.binaryAsString true
spark.kryoserializer.buffer.max 2000M
spark.driver.maxResultSize      8G
spark.akka.frameSize            1024
#spark.executor.instances       16

2:

Myclass* temp=new Myclass [10];
temp=NULL;
// ..some code..now I need to check if at least one element was inserted
  if (temp!=NULL){
    std::cout<<"The object is not empty";}
  else{
    std::cout<<"The object is  empty";
  }

2 个答案:

答案 0 :(得分:3)

两者都不好。

Myclass* temp=new Myclass [10];
temp=NULL;

这会泄漏内存。第一行返回的指针将丢失。

Myclass* temp=new Myclass [10];

for(int counter=0;counter<10;counter++){
  temp[counter]=NULL;
}

该行

  temp[counter]=NULL;

听起来不对。 temp[counter]计算对象而不是指针。因此,为其分配NULL应该会导致编译器错误。

该行

Myclass* temp=new Myclass [10];

很好。最好使用std::shared_ptrstd::unique_ptr来实现自动内存管理。

之后,你不需要

temp = NULL;

for(int counter=0;counter<10;counter++){
  temp[counter]=NULL;
}

答案 1 :(得分:3)

默认情况下,如果无法分配足够的内存,或者对象构造失败,则C ++ new - 表达式会引发异常。在后一种情况下,先前分配的内存自动(1)解除分配。所以,这实际上是一种保证:

  

您要么获得一个成功初始化的对象,要么在new表达式之后继续执行(它将转到异常处理程序,如果没有处理程序则转到std::terminate )。

因此,在答案的上下文中检查空指针是没有价值的。

所有这些都说,不要使用new来分配数组,只需使用std::vector

vector<MyClass> objects( 10 );    // Initialized and everything.

(1)除非您使用的放置new分配函数没有相应的放置delete函数:如果缺少该函数,则初始化失败将导致内存泄漏。 功能