已经不记得怎样的操作步骤能上图左边gdb debug的样子了了,但结论是: “new User(2, name)” 被编译器g++转为以下两步:
- 调用 libstdc++.so.6 中的函数 operator new(unsigned long) 分配内容空间
- 调用用户自定义的构造函数"User(2, name)" ,注意此时入参this肯定是步骤1中分配的内存空间地址
注意以上 步骤1 和 步骤2 是平行的,即 gcc 产生了这两步 并将这两步正确的糅合到一起。
并不是 步骤1"operator new(unsigned long) " 中调用了 步骤2用户自定义构造函数
而是先做步骤1,(并将步骤1返回值 作为 入参this ) 再做步骤2
由此可见 第一件事情 是 修改 libstdc++ 中的 operator new
估计具体是 new_op.cc
如果gcc换成clang(llvm),则有可能是 new.cpp
/main.cpp
#include <iostream>
#include "User.h"
int main() {
std::string * name=new std::string ("zhangsan");
User * pUser=new User(2, name);
std::cout << "user:" << pUser->getName() << std::endl;
return 0;
}
/User.cpp
#include "User.h"
User::User(long _id, std::string * _name) : id(_id), name(_name) {
}
///User.h
#ifndef EXPERIMENT_USER_H
#define EXPERIMENT_USER_H
#include <string>
class User {
protected:
long id;
std::string* name;
public:
User(long _id, std::string *_name);
~User();
std::string getName(){return * (this->name);}
};
#endif