gpt4 book ai didi

c++ - 'new'和 'delete'不同范围内的合法性和道德性

转载 作者:太空宇宙 更新时间:2023-11-04 15:50:44 25 4
gpt4 key购买 nike

我正在一个函数内创建一个动态数组。代码(在下面发布)运行没有任何问题。我想知道我编写的方法是否是正确的方法,或者它是否会在将来产生更复杂的代码问题。我知道我的程序(如下)试图实现的特定任务使用字符串或 vector 效果更好。但是我创建了这个人工示例来解决我的问题。但是,如果您强烈认为应该避免使用动态数组,请随时分享您的意见和理由。

我之前的研究结果:我无法找到关于使用 new [] 创建动态数组然后在不同范围内删除它们的合法性和道德性的连贯讨论。

感谢您的想法和见解。

我的示例代码如下:

==========================

#include<iostream>
#include<string>
#include<cctype>
using namespace std;

void getNonPunct(string _str, char* &_npcarr, int &_npsize);

int main()
{
string input_string;
char* npchar_arr;
int npsize;

cout << "Enter any string: ";
getline(cin, input_string);

getNonPunct(input_string, npchar_arr, npsize);

// Now display non-punctuation characters in the string
cout << "string with non-punctuation characters removed:\n";

for (int n = 0; n <= npsize - 1; n++)
cout << npchar_arr[n];
cout << "\n(" << npsize << ") non-punctuation characters\n";

// Now return the memory allocated with 'new' to heap

delete [] npchar_arr;
// Is it okay to 'delete' npchar_arr eve if it was created in the function
// getNonPunct() ?

return(0);
}
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

void getNonPunct(string _str, char* &_npcarr, int &_npsize)
//This void function takes an input array of strings containing arbitrary
//characters and returns a pointer to an array of characters containing only
//the non-punctuation characters in the input string. The number of
//non-punctuation characters are stored in size. Prior to the function call,
//int_arr and size are undefined. After the function call, char_arr points to
//the first location of an array of the non-punctuation character array.
//'size' is equal to the number of non-punctuation characters in the input
//string.
{

// First get the number of non-punctuation characters in the string

int str_len, npcount = 0;

str_len = static_cast<int>( _str.length() );

_npsize = 0;
for (int i = 0; i <= str_len - 1; i++)
{
if ( !ispunct(_str[i]) )
_npsize++;
}

// Now that you know how many non-punctuation characters are in the string,
// create a (dynamic) character array of _npsize.

_npcarr = new char [_npsize];


for (int k = 0; k <= str_len - 1; k++)
{
if ( !ispunct(_str[k]) )
_npcarr[npcount++] = _str[k];
}

return;
}

最佳答案

有效吗?是的。 npchar_arr指向的数组存在直到你销毁它并且可以使用 delete[] 销毁它另一个函数中的表达式。

这是一个好主意吗?不。你最好使用一个智能指针来自动管理对象的生命周期,让你免于 delete[] 的责任。自己手动调整指针。

考虑使用 std::unique_ptr<char[]>如果你的编译器和标准库支持 unique_ptr , 或 std::auto_ptrstd::shared_ptr如果你不能使用 unique_ptr (shared_ptr 也可以在 Boost 和 C++ TR1 中找到)。

关于c++ - 'new'和 'delete'不同范围内的合法性和道德性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8979563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com