我尝试使用char*
指针来引用strings
和vector<char>
&amp; dynamic arrays
&amp;我对以下结果表示怀疑: -
代码1: -
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout<<"executing...\n";
string s="abcde";
char *c=&s[0];
cout<<c<<"\n";
s.~string();
cout<<c<<"\n";
cout<<"executed";
return 0;
}
此代码的输出为: -
executing...
abcde
abcde
executed
代码2: -
#include <iostream>
#include <vector>
using namespace std;
int main()
{
cout<<"executing...\n";
vector<char> v {'a','b','c','d','e'};
char *p=&v[0];
cout<<p<<"\n";
v.~vector();
cout<<p<<"\n";
cout<<"executed";
return 0;
}
此代码的输出为: -
executing...
abcde
executed
CODE 3(带动态数组): -
#include <iostream>
using namespace std;
int main()
{
cout<<"executing...\n";
char* c=new char[20] {'a','b','c','d','e'};
char *p=c;
cout<<p;
delete[] c;
cout<<"\n"<<p<<"\n";
cout<<"executed";
return 0;
}
此代码的输出类似于CODE 2: -
executing...
abcde
executed
我想知道为什么CODE 1
产生的输出不同于CODE 2
&amp; CODE 3
? string
有什么问题,它的行为与vector<char> & dynamic arrays
不同?
答案 0 :(得分:2)
所有代码片段都访问已删除的数据,该数据没有已定义的行为。因此,任何进一步的假设都是没有意义的,只留给单一案例。无论您是访问vector
,char*
,string
,都没有区别:它始终是相同的违规行为。
答案 1 :(得分:0)
我想这个例子足以证明你的string
&amp; vector
被删除两次,从而导致undefined behaviour
: -
#include <iostream>
using namespace std;
class X
{
int x;
public:
X()
{
cout<<"constructing\n";
}
// other member functions...
~X()
{
cout<<"destroying\n";
}
};
int main()
{
X object;
object.~X();
return 0;
}
输出将是: -
constructing
destroying
destroying
当行为未定义时,没有考虑“为什么这样的输出”等东西!即使我对reference counting of C++ strings
有疑问,但很多人都说strings
不再是reference counted
,因此CODE 1也会产生undefined behaviour
。但是我喜欢你试验代码。有必要正确学习一门语言。坚持下去!!!