#include <stdio.h>
#include <stdlib.h>
#include <string>
class myclass{
char* s;
public:
myclass(){
s = new char[10];
s = "addddd";};
~myclass(){
    delete s;
printf("析构类\n");
};};
int main(int argc, char *argv[])
{
if(1)
{
myclass a;
}
printf("结束");
    system("pause");
return 0;
}本来我想试,类里有成员char *s;
为之new然后赋一个串,如“abcde",new 到的指针是0x004020af。在MyClass里任何地方都不delete,析构的时候也不。
那么当类析构了,0x004020af这块指针上的数据应该还是“abcde"吧,我想知道,别的程序可以访问这块内存吗?这块内存被释放了没有?可我用另一个程序看的时候
#include <stdio.h>
int main(int argc, char *argv[])
{
char* add = (char*)0x004020af;
printf("%s", (void*)add);
return 0;
}
0x004020af上什么也没有啊,这是怎么回事?即使是myclass a存在的时候,没有被析构之前,0x004020af上也看不到值。

解决方案 »

  1.   

    不会啊,我的都看到啦,没问题啊,是不是内存变化啦,你可以把char* s做public的,这样不就可以直接访问啦
    int main(int argc, char *argv[])
    {
    myclass* pa;
    if (1)
    {
    myclass a;
    pa = &a;
    }
    char* add = (char*)(pa->s); 
    printf("%s", (void*)add); 
    cout << pa->s << endl; printf("结束");
    system("pause");
    return 0;

      

  2.   

    1、如果new出来的内存没有释放,会造成内存泄漏。
    new要对应delete。
    2、在内存0x004020af上的值在程序没有修改它之前应该还是原来的值。
    3、不同程序的地址空间是独立的,你用另外一个程序访问这个地址,事实上访问的是本程序的虚拟内存空间,并不是你的原意。
      

  3.   

    那为什么用spy++看到一个容器的句柄(也是个地址),就能直接sendmessage呢?
      

  4.   

    这解释了我心中的一个疑惑,
    C++ Builder里有一些类是自我释放的,如线程类
    你可以new它,然后给它的一个成员变量
    this->FreeOnTerminated = true;
    这样,当线程结束的时候,自动会释放,无需自己delete,
    我是想把这个类变成一个窗口的成员,那这个窗口不在了,这个线程仍然在执行。