#include <iostream>
#include <vector>
using namespace std;
#if 0
命令行模式下
ctrl + l 清屏
ctrl + h 删除字符
printenv | grep PATH
test=goodcpp =两边没有空格
echo $test
export test 将环境变量加入当前范围中
unset test 卸载test环境变量
vim ~/.bashrc
vim --version vim 版本
Esc状态下
hjkl 对应 右下上左
o (小字母o) 在下插入一行
x删除当前字符,dd删除整行
a在当前字符的后面写入字符,i当前字符的前面写入字符
0(零) 移动到行首
$ 移动到行尾
/需要查找字符 回车调用第一个字符,n向下查找 N向上查找
?需要查找字符 回车跳到最后一个字符
dd 删除一行(实际是剪切), p粘贴
yy 复制当前行 p粘贴(当前行的下一行)
u 回撤一步 crtl+r前进一步
. 重复上一个命令
数字 命令 重复命令n此,例子:2dd,连续删除两行
数字G 跳到第n行
gg 直接跳到第一行
G 直接跳到最后一行
% 从左括号跳到右括号
*或者# 向下或者上查找该单词
gg=G 全部自动对齐
Esc : (esc+冒号)
set number 显示行号
数字 回车 跳到第n行
Esc v
选择模式,通过控制hjkl选择,然后y(复制)p(粘贴),d(删除) = 自动对齐
#endif
class A1 {
public:
A1() :mval(new int(3)) {}
~A1() {
cout << "~A1()" << endl;
delete mval;
}
void myprint() {
cout << "myprint()" << endl;
}
private:
int mdata[100];
int* mval;
};
void test1() {
char p1[1024];
char* p2 = new char[1024];
A1* a1 = new(p1)A1(); //p1 p2效果等同
//a1->~A1(); //不会有异常
//delete a1;
//会抛出异常,默认先调用析构函数,然后把资源还给系统,
//然而char p1[1024]不是从new中获得而来,释放了不是由该类申请的内存
//如果由new申请的内存,则由delete负责处理
//delete = 1.调用析构函数,释放对象中的成员资源
// 2.归还对象空间(free)
vector<A1> a;
a.reserve(100); //类比于placementnew(),申请一大块连续的空间,没有调用构造函数
A1* a2 = new A1();
a2->~A1();
delete a2;
a2 = NULL;
a2 = (A1*)p1;
a2->myprint(); //单纯调用myprint()不会出错,无论a2是delete还是NULL还是类型强转
//析构函数和delete一块写也错,同一块空间被释放了两次
//如果析构函数中没有释放成员变量的资源,则不会出错
//调用析构函数之后,可以认为调用一个普通函数,该类对象还存在
//delete之后,对象指针所指向的内存就放在空闲内存池中(即所谓的归还给系统),
//当进行其他操作时,该对象指针所指向的内存可能被覆盖写入。
}
int main()
{
test1();
system("pause");
return 0;
}