C 、C++区别和细节

typedef struct LNode{
    int value;
    struct LNode *next

}LNode,*LinkLIst;//此处可注释

通过typedef 我们可以知道:
Lnode 是struct LNode的别名
LinkList 是 struct LNode * 的别名

在不定义别名的时候,即注释掉那行。

struct test{int b;};

struct test a;  // 编译通过
test a; // C语言编译错误,C++编译通过。

C++中 test a 就是表示struct test a

编译C语言,扩展名一定要用c,不能用cpp。

char *p = new char[100];
p = "I love";
p[10] = 'w';

这里有几个问题你知道吗?

两个问题:

char *p = new char[100];  // 申请了100个字节的内存,给p
p = "I love";   // 把只读内存"I love"的首地址给了p(原来的100字节怎么办?)
p[10] = 'w';   // 修改只读内存,进程崩溃了

原来的100个字节的首地址,谁也找不到了,没法释放(你没调用delete),这个有个术语,叫“内存泄漏”

malloc的内存必须free
new的内存必须delete
否则就内存泄漏。

char *p = new char[100];
delete []p;
p = "I love";

这样有问题吗?

在C++98标准中,这种写法是完全正确的。

不过,在C++11标准中,这种写法不提倡。

C++11标准要求,字符串常量,最好要用const char ,不要用char

const char *p = “I love”;

C语言只有malloc,C++既有malloc,又有new,那么他们一样吗?

肯定不一样。
没用“类”(class)的情况下,malloc和new相近。
用了“类”,malloc和new就不一样了。
那么struct算类吗?
C++的struct是被当作class来编译的,所以C++没有结构体。C语言才有结构体。

#include <iostream>
#include <stdlib.h>

using namespace std;

class Test
{
public:
    Test()
    {
        cout << "Test 1" << endl;
    }
    ~Test()
    {
        cout << "Test 2" << endl;
    }
};

int main()
{
    Test *p;
    cout << "malloc" << endl;
    p = (Test *)malloc(sizeof(Test));
    free(p);
    cout << "free" << endl;

    cout << endl;

    cout << "new" << endl;
    p = new Test;
    delete p;
    cout << "delete" << endl;
    system("pause");
    return 0;
}

运行这段代码,就能明显看出区别了。

C++的“类”(class)里面有两个特殊的成员函数,分别叫做“构造函数”和“析构函数”。
malloc:申请内存,结束。
new:申请内存,调用构造函数,结束。
free:释放内存,结束。
delete:调用析构函数,释放内存,结束。

比较这两段代码

http://codepad.org/E7aQYT9G

http://codepad.org/vheGfj0u

代表区别就是delete p和delete []p;

按C++标准的规定,这是未定义行为。

new对应delete
new[]对应delete[]
malloc对应free

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值