【问题标题】:Recursion with pointer and memory leak带有指针和内存泄漏的递归
【发布时间】:2012-05-29 07:00:45
【问题描述】:

我尝试编写一个将数字转换为单词的简单程序(即将 123 转换为 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;
}

【问题讨论】:

  • 这看起来像是一个家庭作业问题。如果是这样,您应该使用作业标签对其进行标记。另外,你有什么理由 #include &lt;string&gt; 然后使用 char* 作为你的字符串?最后,const char *place[] 可能不会做你期望它做的事情。
  • @OmnipotentEntity 谢谢。这不是作业问题,我只是想通过递归来学习内存管理的已知问题。

标签: c++ pointers memory-management memory-leaks recursion


【解决方案1】:

“谁能指出以下代码在执行时是否会发生内存泄漏?”

是的,可以。

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

[...]

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

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

【讨论】:

  • 感谢您的评论。我刚刚开始使用 C++ 并尝试学习内存管理。我用char *temp_string; 更改了char *temp_string = new char[100]; 并删除了delete[] temp_string 语句,程序运行没有任何错误。这能解决所有问题吗?
  • 你对变量stringword做同样的事情,你也改变了这些吗?另外,仅供参考,您可以使用 Valgrind 自动检查这些事情。
  • 我对@9​​87654329@ 做了同样的事情,但对word 做了同样的事情,它给了我一个总线错误。我会试试 Valgrind,谢谢他的信息。我试图了解当函数调用创建堆栈时这些指针是如何工作的,以及应该如何在函数返回时释放它。
  • @DangerousScholar:你没有没有word做同样的事情; strcat 返回第一个参数的地址,因此不会丢失任何内容 WRT word(但通常不使用返回值,因为它是多余的)。 WRT 你对temp_string 的更改,你仍然需要delete 它在某处如果 你将它分配给convert_number() 的返回值,因为该值是用new 分配的。我建议你把它带到cboard.cprogramming.com,因为这不是真正来回的地方;他们会尖叫 C 和 C++ 的混合,但 que sera...提到它也是一个交叉帖子;)
猜你喜欢
  • 2016-05-14
  • 1970-01-01
  • 2018-10-18
  • 2022-01-26
  • 2012-11-15
  • 2013-10-31
  • 2015-12-15
  • 2021-10-06
  • 2017-03-10
相关资源
最近更新 更多