内存管理问题strcpy函数和malloc、free函数的应用问题

时间:2021-01-18 18:53:05

#include <iostream>
#include <cstring>
#include <string>
using namespace std ;
int main ( )
{
char *str = ( char * ) malloc( 100 ) ;
strcpy( str , "hello baby" ) ;
         free( str ) ;
if( str != NULL )
{
strcpy( str , "world " ) ;
cout << string( str ) << endl ;
}
return 0 ;
}

请教这个程序,已经释放了str指向的内存空间,为什么还可以使用strcpy这个函数实现复制呢?

19 个解决方案

#1


释放了就让str=NULL;吧。

#2


楼主拿下面的代码去玩玩,看有没有灵异事件?

#include <iostream>
#include <cstring>
#include <string>
using namespace std ;
int main ( )
{
    char *str = ( char * ) malloc( 100 ) ;
    strcpy( str , "hello baby" ) ;
         free( str ) ;
    int * ai= ( int * ) malloc( 100 ) ;
    ai[0]=100;
    cout<<ai[0]<<endl;
    if( str != NULL )
    {
        strcpy( str , "world " ) ;
        cout << string( str ) << endl ;
        cout<<ai[0]<<endl;
    }
    free(ai);
    return 0 ;
}

#3


free不给str赋NULL,所以下面的str!=NULL判断是没用的,free的空间并不是不能用,只是已经不属于你的程序,随时可能会分给其它程序

#4


复制会执行,但是是错的。

#5


free(str);//只是把str指向的空间释放了,但是str指针还在,第二次你使用strcpy的时候没有打印出来东西

#6


free并不返回NULL指针

#7


这个就是林锐说的 野指针的问题,
释放了一定赋值NULL

#8


这个要靠你自己控制。。。free之后记得先置空就可以了。

#9


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

struct Test
{
    virtual void fun(){ cout<<"I am test!";}
};
int main ( )
{
    char *str = ( char * ) malloc( 100 ) ;
    strcpy( str , "hello baby" ) ;
         free( str ) ;
    Test t = new Test;
    if( str != NULL )
    {
        strcpy( str , "world " ) ;
        cout << string( str ) << endl ;
    }
    t.fun();
    return 0 ;
}

运行这个代码看是否会出错。

#10


看一下

#11


引用 3 楼 w0911h 的回复:
free不给str赋NULL,所以下面的str!=NULL判断是没用的,free的空间并不是不能用,只是已经不属于你的程序,随时可能会分给其它程序


正解!

#12


引用 3 楼 w0911h 的回复:
free不给str赋NULL,所以下面的str!=NULL判断是没用的,free的空间并不是不能用,只是已经不属于你的程序,随时可能会分给其它程序


野指针!

#13


出错的,这个代码
引用 9 楼 xingzhe2001 的回复:
C/C++ code#include<iostream>
#include<cstring>
#include<string>usingnamespace std ;struct Test
{virtualvoid fun(){ cout<<"I am test!";}
};int main ( )
{char*str= (char* ) malloc(100 ) ;
    strcpy( str ,"hello baby" ) ;
         free( str ) ;
    Test t=new Test;if( str!= NULL )
    {
        strcpy( str ,"world" ) ;
        cout<<string( str )<< endl ;
    }
    t.fun();return0 ;
}
运行这个代码看是否会出错。

#14


引用 2 楼 mstlq 的回复:
楼主拿下面的代码去玩玩,看有没有灵异事件?
C/C++ code
#include<iostream>
#include<cstring>
#include<string>usingnamespace std ;int main ( )
{char*str= (char* ) malloc(100 ) ;
    strcpy( str ,"hello baby" ) ;
         free( str ) ;int* ai= (int* ) malloc(100 ) ;
    ai[0]=100;
    cout<<ai[0]<<endl;if( str!= NULL )
    {
        strcpy( str ,"world" ) ;
        cout<<string( str )<< endl ;
        cout<<ai[0]<<endl;
    }
    free(ai);return0 ;
}

确实很灵异,能解释下嘛?

#15


引用 9 楼 xingzhe2001 的回复:
C/C++ code#include<iostream>
#include<cstring>
#include<string>usingnamespace std ;struct Test
{virtualvoid fun(){ cout<<"I am test!";}
};int main ( )
{char*str= (char* ) malloc(100 ) ;
    strcpy( str ,"hello baby" ) ;
         free( str ) ;
    Test t=new Test;if( str!= NULL )
    {
        strcpy( str ,"world" ) ;
        cout<<string( str )<< endl ;
    }
    t.fun();return0 ;
}
 运行这个代码看是否会出错。

编译出错,conversion from "test *"to non-scalar type "test" requested

#16


碰巧没有出错而已,因为空间刚被你申请过,所以没有被占用,实际上已经造成内存使用错误。

#17


引用 14 楼 underuwing 的回复:
引用 2 楼 mstlq 的回复:
 楼主拿下面的代码去玩玩,看有没有灵异事件?
 C/C++ code
 #include <iostream>
 #include <cstring>
 #include <string>usingnamespace std ;int main ( )
 {char*str= (char* ) malloc(100 ) ;
     strcpy( str ,"hello baby" ) ;
          free( str ) ;int* ai= (int* ) malloc(100 ) ;
     ai[0]=100;
     cout < <ai[0] < <endl;if( str!= NULL )
     {
         strcpy( str ,"world" ) ;
         cout < <string( str ) < < endl ;
         cout < <ai[0] < <endl;
     }
     free(ai);return0 ;
 }

 确实很灵异,能解释下嘛?

str指向的空间已经被释放,ai申请内存时,系统把原先分配给str的空间分配给了ai,再做拷贝的时候修改了已经不属于str,而是属于ai的内存,so...

#18




 str指向的空间已经被释放,ai申请内存时,系统把原先分配给str的空间分配给了ai,再做拷贝的时候修改了已经不属于str,而是属于ai的内存,so...
[/Quote]那cout<<ai[]输出的应该是str的值啊,怎么是个地址啊

#19


引用 18 楼 underuwing 的回复:
str指向的空间已经被释放,ai申请内存时,系统把原先分配给str的空间分配给了ai,再做拷贝的时候修改了已经不属于str,而是属于ai的内存,so...
 
那cout < <ai[]输出的应该是str的值啊,怎么是个地址啊
[/Quote]
那个不是地址,那是被改变后的内容转换成 int型之后的值。“world”在内存中表示为 0x776f726c6400,前四个字节0x77 6f 72 6c,表示的int型数 为0x 6c 72 6f 77(小端表示转换过来),就是输出的值。

#1


释放了就让str=NULL;吧。

#2


楼主拿下面的代码去玩玩,看有没有灵异事件?

#include <iostream>
#include <cstring>
#include <string>
using namespace std ;
int main ( )
{
    char *str = ( char * ) malloc( 100 ) ;
    strcpy( str , "hello baby" ) ;
         free( str ) ;
    int * ai= ( int * ) malloc( 100 ) ;
    ai[0]=100;
    cout<<ai[0]<<endl;
    if( str != NULL )
    {
        strcpy( str , "world " ) ;
        cout << string( str ) << endl ;
        cout<<ai[0]<<endl;
    }
    free(ai);
    return 0 ;
}

#3


free不给str赋NULL,所以下面的str!=NULL判断是没用的,free的空间并不是不能用,只是已经不属于你的程序,随时可能会分给其它程序

#4


复制会执行,但是是错的。

#5


free(str);//只是把str指向的空间释放了,但是str指针还在,第二次你使用strcpy的时候没有打印出来东西

#6


free并不返回NULL指针

#7


这个就是林锐说的 野指针的问题,
释放了一定赋值NULL

#8


这个要靠你自己控制。。。free之后记得先置空就可以了。

#9


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

struct Test
{
    virtual void fun(){ cout<<"I am test!";}
};
int main ( )
{
    char *str = ( char * ) malloc( 100 ) ;
    strcpy( str , "hello baby" ) ;
         free( str ) ;
    Test t = new Test;
    if( str != NULL )
    {
        strcpy( str , "world " ) ;
        cout << string( str ) << endl ;
    }
    t.fun();
    return 0 ;
}

运行这个代码看是否会出错。

#10


看一下

#11


引用 3 楼 w0911h 的回复:
free不给str赋NULL,所以下面的str!=NULL判断是没用的,free的空间并不是不能用,只是已经不属于你的程序,随时可能会分给其它程序


正解!

#12


引用 3 楼 w0911h 的回复:
free不给str赋NULL,所以下面的str!=NULL判断是没用的,free的空间并不是不能用,只是已经不属于你的程序,随时可能会分给其它程序


野指针!

#13


出错的,这个代码
引用 9 楼 xingzhe2001 的回复:
C/C++ code#include<iostream>
#include<cstring>
#include<string>usingnamespace std ;struct Test
{virtualvoid fun(){ cout<<"I am test!";}
};int main ( )
{char*str= (char* ) malloc(100 ) ;
    strcpy( str ,"hello baby" ) ;
         free( str ) ;
    Test t=new Test;if( str!= NULL )
    {
        strcpy( str ,"world" ) ;
        cout<<string( str )<< endl ;
    }
    t.fun();return0 ;
}
运行这个代码看是否会出错。

#14


引用 2 楼 mstlq 的回复:
楼主拿下面的代码去玩玩,看有没有灵异事件?
C/C++ code
#include<iostream>
#include<cstring>
#include<string>usingnamespace std ;int main ( )
{char*str= (char* ) malloc(100 ) ;
    strcpy( str ,"hello baby" ) ;
         free( str ) ;int* ai= (int* ) malloc(100 ) ;
    ai[0]=100;
    cout<<ai[0]<<endl;if( str!= NULL )
    {
        strcpy( str ,"world" ) ;
        cout<<string( str )<< endl ;
        cout<<ai[0]<<endl;
    }
    free(ai);return0 ;
}

确实很灵异,能解释下嘛?

#15


引用 9 楼 xingzhe2001 的回复:
C/C++ code#include<iostream>
#include<cstring>
#include<string>usingnamespace std ;struct Test
{virtualvoid fun(){ cout<<"I am test!";}
};int main ( )
{char*str= (char* ) malloc(100 ) ;
    strcpy( str ,"hello baby" ) ;
         free( str ) ;
    Test t=new Test;if( str!= NULL )
    {
        strcpy( str ,"world" ) ;
        cout<<string( str )<< endl ;
    }
    t.fun();return0 ;
}
 运行这个代码看是否会出错。

编译出错,conversion from "test *"to non-scalar type "test" requested

#16


碰巧没有出错而已,因为空间刚被你申请过,所以没有被占用,实际上已经造成内存使用错误。

#17


引用 14 楼 underuwing 的回复:
引用 2 楼 mstlq 的回复:
 楼主拿下面的代码去玩玩,看有没有灵异事件?
 C/C++ code
 #include <iostream>
 #include <cstring>
 #include <string>usingnamespace std ;int main ( )
 {char*str= (char* ) malloc(100 ) ;
     strcpy( str ,"hello baby" ) ;
          free( str ) ;int* ai= (int* ) malloc(100 ) ;
     ai[0]=100;
     cout < <ai[0] < <endl;if( str!= NULL )
     {
         strcpy( str ,"world" ) ;
         cout < <string( str ) < < endl ;
         cout < <ai[0] < <endl;
     }
     free(ai);return0 ;
 }

 确实很灵异,能解释下嘛?

str指向的空间已经被释放,ai申请内存时,系统把原先分配给str的空间分配给了ai,再做拷贝的时候修改了已经不属于str,而是属于ai的内存,so...

#18




 str指向的空间已经被释放,ai申请内存时,系统把原先分配给str的空间分配给了ai,再做拷贝的时候修改了已经不属于str,而是属于ai的内存,so...
[/Quote]那cout<<ai[]输出的应该是str的值啊,怎么是个地址啊

#19


引用 18 楼 underuwing 的回复:
str指向的空间已经被释放,ai申请内存时,系统把原先分配给str的空间分配给了ai,再做拷贝的时候修改了已经不属于str,而是属于ai的内存,so...
 
那cout < <ai[]输出的应该是str的值啊,怎么是个地址啊
[/Quote]
那个不是地址,那是被改变后的内容转换成 int型之后的值。“world”在内存中表示为 0x776f726c6400,前四个字节0x77 6f 72 6c,表示的int型数 为0x 6c 72 6f 77(小端表示转换过来),就是输出的值。

#20