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:调用析构函数,释放内存,结束。
比较这两段代码
代表区别就是delete p和delete []p;
按C++标准的规定,这是未定义行为。
new对应delete
new[]对应delete[]
malloc对应free
时间: 2024-10-22 22:20:25