2012-05-29 94 views
0

我试图写一个简单的程序,将数字转换为单词(即它将123转换为一百二十三)。代码完全编译。代码使用指针和递归,在内存管理方面,我总是发现在C++中非常棘手。任何人都可以指出,如果下面的代码在执行时会发生内存泄漏?提前致谢。递归指针和内存泄漏

#include <iostream> 
#include <string> 
using namespace std; 
char *convert_number(int, int); 

const char *tens[]={"","ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; 
const char *words[]={"zero","one", "two", "three", "four", "five", "six", "seven", "eight", "nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen", "eighteen","ninteen"}; 
const char *place[]={"","thouands","million","billion","trillion"}; 


int main(int argc, char **argv) 
{ 
int number,conv_num,places; 
places=1; 
char *string= new char[1000]; 
char *temp_string = new char[100]; 
cout<<"Enter a number:"; 
cin>>number; 
string = convert_number(number,0); 
cout<<"The word is :"<<string<<endl; 
} 

char *convert_number(int number,int places) 
{ 
int divisor; 
char *word; 
int conv_num; 
char *temp_string = new char[100]; 
word = new char[100]; 
divisor=10; 

if (number>=1000) 
{ 
    conv_num = number % 1000; 
    number = (number-conv_num)/1000; 
    places++; 
    temp_string = convert_number(number,places);  
    word = strcat(word, temp_string); 
    word = strcat(word, place[places]); 
    word =strcat(word," "); 
} 
else 
{ 
    conv_num = number; 
} 
if (conv_num>=100) 
{ 
    word =strcat(word,words[conv_num/100]); 
    word =strcat(word," hundred "); 
    conv_num=conv_num%100; 
} 

if(conv_num >=20) 
{ 
word=strcat(word,tens[conv_num/10]); 
word =strcat(word," "); 
if(conv_num%divisor>=1) 
{ 
    word=strcat(word,words[conv_num%divisor]); 
    word =strcat(word," "); 
    } 
} 

if(conv_num<20) 
{ 
    word=strcat(word,words[conv_num]); 
    word =strcat(word," "); 
}  
delete[] temp_string;  
return word; 
} 
+1

这看起来像一个家庭作业问题。如果是这样,你应该用作业标签标记它。另外,有没有什么理由为你'#include '然后用'char *'作为你的字符串?最后,'const char * place []'可能不会达到你期望的效果。 – OmnipotentEntity

+0

@OmnipotentEntity谢谢。这不是一个家庭作业问题,我只是试图学习使用递归已知问题的内存管理。 –

回答

2

“可以在任何一个点出如果执行时下面的代码可能有内存泄漏?”

是的,它可以。

char *temp_string = new char[100]; // first assignment 

[...] 

if (number>=1000) 
{ 
[...] 
    temp_string = convert_number(number,places); 

当您以这种方式重新分配temp_string时,第一个分配的内存变得不可访问,并且它还没有被释放。首先你应该delete[]

+0

感谢您的评论。我刚开始使用C++并试图学习内存管理。我用'char * temp_string;'改变了'char * temp_string = new char [100];'并删除了'delete [] temp_string'语句,程序运行时没有任何错误。这是否解决了所有问题? –

+0

你用变量'string'和'word'做同样的事情,你是否也改变了这些?此外,仅供参考,您可以使用Valgrind自动检查这些事情。 – OmnipotentEntity

+0

我用'string'做了同样的事情,但用'word'尝试过同样的事情,它给我一个总线错误。 我会尝试Valgrind,谢谢他的信息。 我想了解这些指针如何在函数调用创建堆栈时如何工作以及如何使用函数返回来释放它。 –