使用malloc
或new
創建argv*
數組的想法是一種混亂的方法,可能會導致內存泄漏。
一種方法,將使用malloc
或new
將是這是自由的內存泄漏或存儲器直接分配:
首先,同時存儲一個字符數組的矢量,和指針的向量到char:
class CommandLine
{
typedef std::vector<char> CharArray;
typedef std::vector<CharArray> ArgumentVector;
ArgumentVector argvVec;
std::vector<char *> argv;
public:
CommandLine(std::stream& in);
};
這是argv
矢量,它最終將保存命令行參數所需的char *
。其他ArgumentVector
成員的原因是爲了確保這些字符串不會超出範圍(只要CommandLine
對象處於活動狀態)。
一旦你有了這個,那麼函數放置在argv
向量參數變得更安全:
#include <vector>
#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
//...
using namespace std;
void my_command_line(int numArgs, char** args);
CommandLine::CommandLine(std::istream& in)
{
string cmd;
getline(in, cmd);
string arg;
istringstream iss(cmd);
while (iss >> arg)
{
// create an entry in our string vector. This basically
// replaces the call to allocate for each new string
argvVec.push_back(CharArray(arg.begin(), arg.end()));
// make sure we null-terminate the last string we added.
argvVec.back().push_back(0);
// add the pointer to this string to the argv vector
argv.push_back(argvVec.back().data());
}
// call the alternate command-line function
my_command_line(argv.size(), argv.data());
}
void my_command_line(int numArgs, char** args);
{
for (int i = 0; i < numArgs; ++i)
std::cout << "argument " << i << ": " << args[i] << std::endl;
}
int main()
{
ifstream ifs("Test.txt");
CommandLine test(ifs);
}
注意這裏是malloc
沒有來電,來new
沒有電話,沒有內存泄漏等。唯一的缺點是你需要兩個矢量,一個用於字符串數據,另一個用於保存指向每個字符串項的指針,後者用於類似「main-like」函數所需的char**
類型(在上例中,「main」函數只是輸出它給出的參數列表)。
現在,當CommandLine
對象超出範圍時,所有元素都會被清除,因爲字符串和指針都存儲在向量中。沒有內存泄漏,沒有指針採取不適當等
直播示例:http://ideone.com/0tCfYa
另外,線29是在構造中的最後一行,即「的argv =(字符*)malloc的(的argc *的sizeof(argv的) );」 – reubonwry
'char * argv [];'這是非標準的C++。數組必須使用編譯時表達式聲明,而不是留空。你可以簡單地使用'std :: vector'代替,那麼當我們處於這個狀態時,給你這個問題的代碼就是'argv.resize(argc);'而不是'malloc' –
PaulMcKenzie
:'std :: vector'... –