C和C ++中的内存管理有什么区别

问题描述 投票:1回答:2

[如何动态地为const char*个数组分配内存?即,例如,const char** array = /* ??? */。我知道malloc与C ++中的new类似,但始终返回void*

更广泛地说,在C和C ++中如何处理内存管理之间有什么区别?例如,在C语言中我需要提防别人可能不会想到的C ++语言?

c++ c memory memory-management heap-memory
2个回答
2
投票

要分配数组,您将执行以下操作:

const char **array = malloc( x * sizeof( char * ) );

然后分配数组的每个元素。

if ( array )
    for ( int i = 0; i < x; ++i )
        array[i] = malloc( y * sizeof( char ) );
else
    printf( "malloc failed :(" );

malloc返回一个void*,但它与其他指针类型兼容。

在C和C ++中,您都需要自己管理内存,但是C没有unique_ptr之类的东西-而且,没有newdelete,请使用mallocfree。还有callocrealloc

malloc在失败的情况下可以返回NULL,因此您也[进行检查。请注意,它不会像C ++中的new那样抛出。有关malloc的更多信息,请参见here

根据要求,释放阵列时,基本上只是相反地做同样的事情。注意free的大小不只是指针。 free函数将忽略free指针,因此您不必为此担心。

NULL

当然,与C ++中一样,不要将for ( int i = 0; i < x; ++i )
   free( array[i] );
free( array );
内存加倍。那很不好。 :)

1
投票
C ++中存在但C语言中不存在的另一个内存管理方面是C ++对类具有面向对象的方法。创建实例后,将调用该实例的构造函数,当实例超出范围时,将调用析构函数,此行为由编译器自动执行,并且对程序员透明。

因此,优良作法是在析构函数中运行动态内存de分配,以确保当实例不再在范围内时,释放由实例分配的任何动态内存。

构造函数和解构器概念仅在C ++中存在,而在C中不存在。

© www.soinside.com 2019 - 2024. All rights reserved.