如何防止删除成员函数返回的指针?

enz*_*m83 1 c++ arrays oop pointers

请考虑下面的示例代码.该类Data用于存储数据数组:为简单起见,我选择使用vector<char>as数据成员.但是,这些数据必须由外部例程处理,这需要指向数组的第一个元素的指针,当然还有这个数组的长度:因此,我还实现了函数get_data()get_length().

class Data
{
public:
    Data(const char* sourcePtr, int sourceLength) : _data(sourcePtr, sourcePtr+sourceLength) { ; }

    const char* get_data() const { return &_data.front(); }
    int get_length() const { return _data.size(); }

    void print() const
    {
        vector<char>::const_iterator it;
        for(it = _data.begin(); it != _data.end(); ++it)
            cout << *it;
    }

private:
    vector<char> _data;
};
Run Code Online (Sandbox Code Playgroud)

现在考虑使用该类的以下代码示例Data.

int main(int argc, char** argv)
{
    char* a = new char[4];
    a[0] = 'b';
    a[1] = 'y';
    a[2] = 't';
    a[3] = 'e';

    Data myData(a,4);
    delete[] a;

    myData.print();
    cout << endl;

    const char* aPtr = myData.get_data();

    // The following statement frees the memory allocated
    // for the data member of the class Data.
    delete[] aPtr;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的语句delete[] aPtr释放了为类的数据成员分配的内存Data.因此,当myData对象自动解除分配时,vector<char>已经手动释放了内容,显然会出现错误SIGABRT.

如何确保编译器将语句表示delete[] aPtr为错误?你应该如何修改类Data来实现这个目标?

小智 6

处理这个问题最直接的方法是确保谁是指针的"拥有者".在我的C++时代,如果一个函数返回一个指针,那么该函数的名称应该以"Create"而不是"Get"开头.后来,在这种情况下,我们通常返回智能指针.

实际上编写C++并不困难,你永远不需要显式地删除任何指针,而是将它们全部存储在一个智能指针中,当指针被自身销毁时它将被删除.