分配内存后初始化指针的最佳方法是什么。 我的选择:
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";
}
答案 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_ptr
或std::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
函数:如果缺少该函数,则初始化失败将导致内存泄漏。
功能