*有个不理解的地方,为什么char buffer[512]经过(void )buffer转换后,可以输出buffer的地址。
两个最大的区别:placement new不能使用delete删除内存,因为delete只能删除堆中分配的内存。
// 定位new运算符的使用:普通new从堆中分配内存,定位new可指定空间。
#include
#include
using namespace std;
int BUF = 512;
const int N = 5;
char buffer[512];
int main()
{
double *pd1, *pd2;
int i = 0;
cout << "Calling new and placement new:\n";
pd1 = new double[N];
pd2 = new (buffer) double[N];
for (i = 0; i < N; i++)
{
pd1[i] = pd2[i] = 1000 + 20 * i;
}
cout << "Memory addresses :" << "heap:" << pd1 << " static:" << &buffer << endl; // 两种写法输出相同,为什么?
cout << "Memory addresses :" << "heap:" << pd1 << " static:" << (void *)buffer << endl; // 需要进行一个转化,和上边一样。
cout << "Memory contents:\n";
for ( i = 0; i < N; i++)
{
cout << pd1[i] << "at" << &pd1[i] << ";";
cout << pd2[i] << "at" << &pd2[i] << endl;
}
cout << "Calling new and placement new \n";
delete [] pd1; // 释放pd1内存。
pd1 = new double[N];
pd2 = new (buffer + N * sizeof(double)) double[N]; // 可开看出,指向上一次地址之后的位置。
for (i = 0; i < N; i++)
{
pd1[i] = pd2[i] = 1000 + 20 * i;
}
for (i = 0; i < N; i++)
{
cout << pd1[i] << "at" << &pd1[i] << ";";
cout << pd2[i] << "at" << &pd2[i] << endl;
}
delete[]pd1;
system("pause");
return 0;
}
2. namespace 的用法
说明namespace的用法,案例是332页书上的例子。
包涵一个头文件和两个源文件
// namesp.h
#ifndef NAMESP_H_ // 防止重复定义
#define NAMESP_H_
#include
// 定义了两个命名空间,第二个空间包含了第一个空间的Person结构体,用using namespacec pers编译指令。
namespace pers
{
struct Person
{
std::string fname;
std::string lname;
};
void getPerson(Person &);
void showPerson(const Person &);
}
namespace debts
{
using namespace pers;// 这个位置使用了using 编译文件,在getDebts中可调用pers中的getPerson文件
struct Debt
{
Person name;
double amount;
};
void getDebt(Debt &);
void showDebt(const Debt &);
double sumDebts(const Debt ar[], int n);
}
#endif
// 第二个文件实现了第一个文件的声明
// namesp.cpp
#include
#include "namesp.h"
// 第二个文件是源文件,提供了头文件函数原型对应的定义。
namespace pers
{
using std::cout;
using std::cin;
using std::endl;
void getPerson(Person & rp)
{
cout << "Enter first name";
cin >> rp.fname;
cout << "Enter last name";
cin >> rp.lname;
}
void showPerson(const Person & rp)
{
cout << rp.lname << "," << rp.fname<< endl;
}
}
namespace debts
{
void getDebt(Debt &rd)
{
getPerson(rd.name);
std::cout << "Enter debt:";
std::cin >> rd.amount;
}
void showDebt(const Debt & rd)
{
showPerson(rd.name);
std::cout << ":" << rd.amount << std::endl;
}
double sumDebts(const Debt ar[], int n)
{
double total = 0;
for (size_t i = 0; i < n; i++)
{
total += ar[i].amount;
}
return total;
}
}
// 对上边namespace的使用。
// namessp.cpp
#include
#include "namesp.h"
void other(void);
void another(void);
int main(void)
{
using debts::Debt; // 引入结构体
using debts::showDebt;
Debt golf = { {"Benny","FFFFF"},120.0 };
showDebt(golf);
other();
another();
system("pause");
return 0;
}
void other(void)
{
using std::cout;
using std::endl;
using namespace debts; // 这里包涵了namespace per,所以能使用showPerson
Person dg = { "DDDDDD","AAAAAA" };
showPerson(dg);
cout << endl;
Debt zippy[3];
int i;
for ( i = 0; i < 3; i++)
{
getDebt(zippy[i]);
}
for ( i = 0; i < 3; i++)
{
showDebt(zippy[i]);
}
cout << "Total debt:$" << sumDebts(zippy, 3) << endl;
return;
}
void another(void)
{
using pers::Person;
Person collector = {"Milo","Rightshift"};
pers::showPerson(collector);
std::cout << std::endl;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)