[记录]有关c/c++中的delete/new和malloc/free

今天在修复由用户反馈的一个有关缓冲合并工具的bug,经调试跟踪很快找到问题原因,是把mp4格式当作flv格式进行合并了(所以就根本不能合并~)。

准备实现合并mp4格式的功能,一开始在网络上查找了mp4相关的资料,发现有点复杂。之前在实现合并flv时,也花了几天时间才完成,效果还不是很好。缓冲合并工具中合并flv也是在java层进行数据处理的,速度有点慢;从对mp4格式的初步了解来看,合并mp4会比flv更慢(如果还是在Java层实现的话)。经过重新考虑,准备把所有合并都用c实现,用jni进行调用。

在写着c代码时,用到了malloc和free,所以引出了查找delete和free的资料,对于使用来说,这里有些内容可以记录一下:

class  Test
{
public:
    Test()
    {
        cout  <<  "Test  :  ctor\r\n";
    }
    ~Test()
    {
        cout  <<  "Test  :  dtor\r\n";
    }
    void Hello()
    {
        cout  <<  "Test  :  Hello  World\r\n";
    }
};

使用:

Test*  t1  =  new  Test();
  t1->Hello();
  delete  t1;

  Test*  t2  =  (Test*)  malloc(sizeof  Test);
  t2->Hello();
  free(t2);

正确执行上面的代码后,输出应该就是下面这样:

Test : ctor
Test : Hello World
Test : dtor
Test : Hello World

可以看到malloc/free不会像new/delete那样触发构造函数和析构函数!再看下面这个例子:

class Test2
{
public:
  Test2(int y)
  {    
  }    
};
Test2* t2array = new Test2[10];

上面这个将会有错误发生,因new数组的话,会调用默认构造函数,而Test2没有默认构造函数,所以会有错误。下面再看看一个使用例子:

//基础类型

int* i1 = new int;
delete i1;

int* i2 = (int*) malloc(sizeof(int));
free(i2);

//数组类型

char** c1 = new char*[10];
delete[] c1;

char** c2 = (char**) malloc(sizeof(char)*10);
free(c2);

注意红色部分,在使用delete时,如果是基础类型指针,只需要delete就可以了,而如果是数组类型指针那么就要用delete[],否则只删除第一个数组;而是用free时,需要传首地址,所以都是直接"变量名"(在例子中都是指针指向首地址的指针)就可以了。

 

以上内容是从一篇英文文章而来,文章地址在这里

» 本文链接地址:https://www.xidige.com/471

打开支付宝扫一扫,即可进行扫码打赏哦

扫码支持
扫码打赏,你说多少就多少

标签:

分享到:

扫一扫 在手机阅读、分享本文

上一篇: 下一篇:
评论区0人评论159人参与

电子邮件地址不会被公开。 必填项已用*标注

*

loading

赞助商广告