提问者:小点点

指针删除的C++模式?


我想知道是否存在删除指针的模式。更具体地说,当您需要为数据调用某种中间函数时。下面是我所想的一个例子:

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 */;
}

其目的是避免对集合属性的数据进行中间调用。再一次,我只是想问一下这是不是常用的,或者一开始是不是一个好主意。

非常感谢。


共1个答案

匿名用户

通常的做法是以您正在使用的方式远离原始指针。如果您的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_ptrstd::unique_ptr。这些家伙很棒。他们为你处理这一切,有引用计数。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(指针|删除|c++|模式)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?