考虑下面的示例代码。该类Data
用于存储数据数组:为简单起见,我选择使用 avector<char>
作为数据成员。但是,这些数据必须由外部例程处理,这需要一个指向数组第一个元素的指针,当然还有这个数组的长度:为此,我还实现了函数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;
};
现在考虑以下使用类的代码示例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;
}
上面的语句delete[] aPtr
释放了为类的数据成员分配的内存Data
。结果,当myData
对象被自动解除分配时, 的内容vector<char>
已经被手动解除分配,显然会出现错误SIGABRT。
如何确保编译器将该语句表示delete[] aPtr
为错误?你应该如何修改类Data
来实现这个目标?