容器中保存了对象,但并不是你提供给容器的那些对象。而当你从容器中取出一个对象时,你所取出的也不是容器中所保存的那份。当向容器中加入对象时,存入容器的是你所指定对象的拷贝。当从容器中取出一个对象时,你所得到的是容器中所保存的对象的拷贝。进去的是拷贝,出来的也是拷贝,也就是STL的工作方式。
vector
class read_hook{
public:
void *ctx;
char disable;
};
int main(){
std::vector<read_hook*> vec;
for (int i = 0; i < 3; ++i) {
read_hook *hook = new read_hook;
printf("%p\t", hook);
vec.push_back(hook);
}
printf("\n");
for (int i = 0; i < 3; ++i) {
read_hook *hook = vec[i];
printf("%p\t", hook);
}
printf("\n");
for(auto iter : vec){
read_hook *hook = iter;
printf("%p\t", hook);
}
printf("\n");
for(auto &iter : vec){
read_hook *hook = iter;
printf("%p\t", hook);
}
__gnu_cxx::__normal_iterator<read_hook **, std::vector<read_hook *>> iter;
for (iter = vec.begin(); iter != vec.end(); ++iter) {
read_hook *hook = *iter;
printf("%p\t", hook);
}
printf("\n");
}
好的写法:
class read_hook{
public:
read_hook(){
printf("read_hook, %p\n", this);
}
~read_hook(){
printf("~read_hook, %p\n", this);
}
void *ctx;
char disable;
};
int main(){
std::vector<read_hook*> vec;
printf("\n --- vec.size: %zu --- \n", vec.size());
for (int i = 0; i < 3; ++i) {
read_hook *hook = new read_hook;
vec.push_back(hook);
}
printf("\n --- vec.size: %zu --- \n", vec.size());
while (!vec.empty()){
read_hook *hook = *vec.begin();
//read_hook *hook = vec.front();
vec.erase(vec.begin());
delete hook;
}
printf("\n --- vec.size: %zu --- \n", vec.size());
getchar();
}
class read_hook{
public:
read_hook(){
printf("read_hook, %p\n", this);
}
~read_hook(){
printf("~read_hook, %p\n", this);
}
void *ctx;
char disable;
};
int main(){
std::vector<read_hook*> vec;
printf("\n --- vec.size: %zu --- \n", vec.size());
for (int i = 0; i < 3; ++i) {
read_hook *hook = new read_hook;
vec.push_back(hook);
}
printf("\n --- vec.size: %zu --- \n", vec.size());
while (!vec.empty()){
read_hook *hook = vec.back();
vec.erase(vec.end() - 1);
delete hook;
}
printf("\n --- vec.size: %zu --- \n", vec.size());
getchar();
}
class read_hook{
public:
read_hook(){
printf("read_hook, %p\n", this);
}
~read_hook(){
printf("~read_hook, %p\n", this);
}
void *ctx;
char disable;
};
int main(){
std::vector<read_hook*> vec;
printf("\n --- vec.size: %zu --- \n", vec.size());
for (int i = 0; i < 3; ++i) {
read_hook *hook = new read_hook;
vec.push_back(hook);
}
printf("\n --- vec.size: %zu --- \n", vec.size());
read_hook *hook = vec[1];
delete hook;
vec.erase(vec.begin() + 1);
printf("\n --- vec.size: %zu --- \n", vec.size());
getchar();
}
不好的写法:
class read_hook{
public:
read_hook(){
printf("read_hook, %p\n", this);
}
~read_hook(){
printf("~read_hook, %p\n", this);
}
void *ctx;
char disable;
};
int main(){
std::vector<read_hook*> vec;
printf("\n --- vec.size: %zu --- \n", vec.size());
for (int i = 0; i < 3; ++i) {
read_hook *hook = new read_hook;
vec.push_back(hook);
}
printf("\n --- vec.size: %zu --- \n", vec.size());
for (int i = (int)vec.size(); i > -1; --i) {
read_hook *hook = vec[i];
vec.pop_back();
delete hook;
}
printf("\n --- vec.size: %zu --- \n", vec.size());
getchar();
}
list
class read_hook {
public:
read_hook() {
printf("read_hook, %p\n", this);
}
~read_hook() {
printf("~read_hook, %p\n", this);
}
void *ctx;
char disable;
};
int main(){
// list不能随意访问元素
std::list<read_hook*> list;
for (int i = 0; i < 3; ++i) {
read_hook *hook = new read_hook;
list.push_back(hook);
}
printf("\n --- list.size: %zu --- \n", list.size());
while (!list.empty()){
read_hook *hook = list.back();
delete hook;
list.remove(hook);
}
printf("\n --- list.size: %zu --- \n", list.size());
getchar();
}