c ++字符串vs vector <char> vs动态数组

时间:2015-10-12 15:59:07

标签: c++ string vector dynamic-arrays

我尝试使用char*指针来引用stringsvector<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 3string有什么问题,它的行为与vector<char> & dynamic arrays不同?

2 个答案:

答案 0 :(得分:2)

所有代码片段都访问已删除的数据,该数据没有已定义的行为。因此,任何进一步的假设都是没有意义的,只留给单一案例。无论您是访问vectorchar*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。但是我喜欢你试验代码。有必要正确学习一门语言。坚持下去!!!