我想知道是否存在删除指针的模式。更具体地说,当您需要为数据调用某种中间函数时。下面是我所想的一个例子:
int main() {
// some code here
char* return_of_function1 = function1(int_array);
int return_of_function2 = function2(return_of_function1);
delete[] return_of_function1;
// some code here
}
char* function1(int* int_array) {
// some code here
}
int function2(char* char_array) {
// some code here
}
int main() {
// some code here
int return_of_function2 = function2(int_array);
// some code here
}
char* function1(int* int_array) {
// some code here
}
int function2(int* int_array) {
// some code here
return function2(function1(int_array), true);
}
int function2(char* char_array, bool delete_array) {
// some code here
if(delete_array) {
delete[] char_array;
}
return /* return value */;
}
其目的是避免对集合属性的数据进行中间调用。再一次,我只是想问一下这是不是常用的,或者一开始是不是一个好主意。
非常感谢。
通常的做法是以您正在使用的方式远离原始指针。如果您的char*确实是一个字符串,那么请使用std::string(例如)。
RAII代表资源获取即初始化。对此重要的是,您用一个对象包装您的资源,并且您让对象超出范围。它会因为超出范围而被破坏,而析构函数是您唯一需要担心破坏数据的地方。如果您真的要使用char*而它实际上不是字符串,因此您应该使用string,它可能如下所示:
class CharArray {
public:
CharArray(whatever args you need);
virtual ~CharArray() { if (ptr) delete[] ptr; }
private:
char * ptr = nullptr;
};
如果CharArray的任何方法实际上可以更改ptr,那么您需要确保首先小心地释放旧的内容。
您还需要确保您有完整的move构造函数/运算符等,这样您就可以安全地返回这些。
另一个选择是智能指针。请参阅std::shared_ptr
和std::unique_ptr
。这些家伙很棒。他们为你处理这一切,有引用计数。