C++ new/delete与 malloc/free

Posted Overboom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ new/delete与 malloc/free相关的知识,希望对你有一定的参考价值。

malloc free / new delete区别

1. malloc free / new delete作用于基本数据类型

针对基本数据类型,new出来的内存可以用delete释放,也可以用free释放,同样malloc出来的内存,可以用free释放也可以用用delete释放。
示例代码:

#include <iostream>

using namespace std;

int main(void)

        int *a (new int(5));
        printf("before delete : *a = %d, a = %p\\n", *a, a);
        delete(a);
        printf("after delete  :  a = %p\\n", a);

        int *b (new int(5));
        printf("before free : *b = %d, b = %p\\n", *b, b);
        free(a);
        printf("after  free :  b = %p\\n", b);

        return 0;

编译输出:

2. malloc free / new delete作用于结构体/类

针对结构体/类,new做两件事,一是分配内存,二是调用类的构造函数;同样,delete会调用类的析构函数和释放内存。而malloc和free只是分配和释放内存。
示例代码:

#include <iostream>

using namespace std;

class CTest

public: 
        CTest();
        ~CTest();

public:
        void print_test();
;

CTest::CTest()

        printf("CTest 构造函数\\n");


CTest::~CTest()

        printf("CTest 析构函数调用\\n");


void CTest::print_test()

        printf("do nothing, just printf\\n");


int main(void)

        CTest *test_ (new CTest);
        test_->print_test();
        delete test_;

        CTest *test2_ = (CTest*)malloc(sizeof(CTest));
        test2_->print_test();
        free(test2_);

        return 0;

编译输出:

3. delete p 与 delete [] p

基本类型数组,delete p与delete [] p是一样的
针对结构体/类,单个堆上的对象,不可以delete []p

4. new在栈区、静态区分配内存

new分配的内存默认是在堆区分配内存的,new也可以在栈区、静态区分配内存,但是在栈区、静态区都不可以delete
示例代码:

#include <iostream>

using namespace std;

static int g_array[100] = 0;

// 栈上分配内存示例
void mem_in_stack()

	char str[1024] = 'M';
	char *p_str1 = new(str)char[10]'a', 'b', 'c', 'd', 'e';
	char *p_str2 = new(str+40)char[20]'a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd', 'e';

	//检验分配的内存可以访问
	for (int i = 0; i < 10; i++)
	
		cout << p_str1[i] << " ";
	
	cout << endl << "************************" << endl;

    for (int i = 0; i < 20; i++)
    
            cout << p_str2[i] << " ";
    
	cout << endl << "************************" << endl;


	// 打印str的地址和p_str1, p_str2的地址
	printf("str首地址:%p, str+40的地址:%p\\n", str, str+40);
	printf("p_str1地址:%p, p_str2地址:%p\\n", p_str1, p_str2);


// 静态区分配内存示例
void mem_in_static()

	int *p1 = new(g_array)int[10]1, 2, 3, 4, 5, 6, 7, 8, 9, 0;
	int *p2 = new(g_array+10)int[40]1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0;

	for(int i = 0; i < 10; i++)
	
		cout << p1[i] << " ";
	

	cout << endl << "************************" << endl;

	for(int i = 0; i < 40; i++)
    
            cout << p1[i] << " ";
    

	cout << endl << "************************" << endl;

	// 打印g_array的地址和p1,p2的地址
	printf("g_array的首地址:%p, g_array+10的地址:%p\\n", g_array, g_array+10);
	printf("p1地址 :%p, p2地址:%p\\n", p1, p2);


int main(void)

	mem_in_stack();	
	mem_in_static();

	return 0;

编译输出:

以上是关于C++ new/delete与 malloc/free的主要内容,如果未能解决你的问题,请参考以下文章

C++中delete与 delete []区别

C++—new/delete/malloc/free详解

C++中的newoperator new与placement new

C++面试题

malloc/free与new/delete的区别与联系

malloc/free与new/delete的区别与联系