本质上他是个类,参数传递的主要是数据,不管他内部实现如何,用他做参数必然会带来后续很多问题的。不用最好
[quote=引用 11 楼 lin5161678 的回复:] vs20XX 你写一个std::string 然后鼠标摆上去 然后按一下F12 你能看到string的完整实现
dll接口当然是套extern "C" 啦 写什么string 呀 就算没智能指针 2个模块使用的string实现不同 也只是换一个姿势死掉而已
太久了, 不记得了。 百度上搜了一下 https://www.cnblogs.com/abella/p/9582549.html
vs20XX 你写一个std::string 然后鼠标摆上去 然后按一下F12 你能看到string的完整实现
关于智能指针,应该是两点: 1 对于编译器来说,智能指针实际上是一个栈对象,并非指针类型 在栈对象生命期即将结束时,智能指针通过析构函数释放有它管理的堆内存。 2 不是为每个数据做一个copy,而是通过引用计数来重用数据。 string里面是否使用智能指针,听谁说都不如自己来做个实验来验证一下 void printString(const string& s ) { unsigned char * pS = (unsigned char *) &s; const char * pCS = s.c_str(); cout << hex << (long &) pS << " " << (long&) pCS << endl; // 输出string对象的地址, 以及内部字符传指针当地址 // 甚至还可以把pS对应的数据输出,看看内存结构如何 } int main () { string s1 = “0123”; // 构造,对象在栈的时候。 也可以再构造一个 const string s3; 来验证此时对象又在哪儿 printString(s1); // 看看数据放哪儿了, 很可能是栈对象 s1 = "012345"; // 修改, 验证字符串改变的时候,内部指针变量是如何处理的 printfString(s1); // 看看指针是否改变, 如果指针没有改变, 把s1赋予一个很长的字符串看看 string * s2 = new string("abcd"); // 动态申请 printString(s2); // 看看对象在堆的时候, 内部指针在哪儿 } 做实验吧, 估计不同的编译器的结果会有不同的差异。 验证上面之后,你还可以去验证把指针赋值给不同的对象后, 不同的对象的c_str()返回指针是否同一个, 借此可以判定是否是智能指针 这不应该是c++标准的问题, 是编译器实现的问题, 研究研究有利于了解c++对象的内存结构和实现原理,可以琢磨琢磨的
以前看到过微软做的解释,说是对dll改成多线程调用模式可以规避这个问题 太久了不写代码了,记不太清楚了
64,635
社区成员
250,963
社区内容
加载中
试试用AI创作助手写篇文章吧