s*******1 发帖数: 20 | 1 What happens after delete? It seems that the object still exists after
delete in the program below.
Thanks.
#include
using namespace std;
class C{
public:
void f(){cout << "exist!" << endl;}
int x;
};
int main()
{
C* Cptr = new C;
Cptr->x=1;
delete Cptr;
Cptr->f();
cout << Cptr->x << endl;
return 0;
}
//output
exist!
1 |
|
U********d 发帖数: 577 | 2 你没有得到他。
你设置了cptr=null,那么你通过cptr调用所有的成员函数和成员变量必然会导致0内存
访问错误。如果你说的some cases是之前有其他的指针比如xxoo=cptr,我觉得可以不
用拿出来说,因为使用xxoo和让cptr=null没有半点关系了。 |
|
l***y 发帖数: 37 | 3 大牛请问
why can't print out c 在内存中的地址
---------------------------------
char c='3';
char *cptr=&c;
char **cptrptr=&cptr;
cout <<"Address of Var i=" < |
|
F********E 发帖数: 1025 | 4 Hi,
I have the following fortran90 code:
**********************************************
TYPE :: CPLK
REAL(8), DIMENSION(:), POINTER :: CP
TYPE(CPLK),POINTER :: NEXT
END TYPE CPLK
...
allocate CPLK linked list
let CPTR point to the last link
...
IF ( ASSOCIATED (CPTR) ) THEN
WRITE(OUTU,*)' deallocate this layer'
DEALLOCATE(CPTR)
ENDIF
***********************************************
Execuation o |
|
J*******g 发帖数: 381 | 5 Sorry,写错了。 应该是这样。
const double pi = 3.14;
const double *cptr = π
*cptr =3.14159;
最后一句出错了。 |
|
z****e 发帖数: 2024 | 6 delete Cptr;
Cptr=0;
to dereference a deleted pointer is undefined. (dangerous)
to dereference a null pointer is a run time error.(safer, but bad, usually segmentation fault)
"delete" calls destructor and modify the linked list which holds address of accessible memory blocks. |
|
N***m 发帖数: 4460 | 7 try set cptr=null in your code to see if you can still
use cptr->f()?
in my case, i can still access it. |
|
N**********d 发帖数: 9292 | 8 例如
char* cptr="aaaaaa";
char c[]="bbbbbb";
怎么知道他们保存在什么地方? |
|
|
c*****t 发帖数: 1879 | 10
cptr points to a data/text memory location. Trying to modify this
content can result in segmentation fault on Unix. On PC, it might
be allowed to modify it though.
c points to a region on stack. You can modify it without hesitation. |
|
J*******g 发帖数: 381 | 11 const double *cptr =3.14159;
这句话为什么有问题? 等号右边的不是一个const literal吗? |
|
b******a 发帖数: 215 | 12 cptr是个pointer啊,不是3.14159。 |
|
S**I 发帖数: 15689 | 13 const double *cptr = new double(3.14); |
|
I*****y 发帖数: 602 | 14 >const double *cptr = π
定义的是一个指向常量的指针。
但是你最后一句想改变这个应该为常量的值,当然要出错了。
进一步看看:下面const修饰指针和const修饰常量的区别。
const double *ptrPI = 3.14;
double const *ptrPIConst = π
double * constprtPIConst = π |
|
U********d 发帖数: 577 | 15 Delete一般是操作系统实现的,通常情况下你delete掉一个对象,操作系统只是将这个
对象所在的内存块标记为空闲,比如windows2000通常情况是把这个堆链回到freelist
或者其他几个堆管理的队列里面去。
把这块内存清0的工作是很费时间的,操作系统一般不主动作这件事情,所以删除掉后
无论内容还是对象的指针都没有任何变化。至于栈上的数值,除非你显示地指定Cptr=
null,否则在它整个生命周期里面也没有任何人会管他,这两个条件导致你短时间内无
论取成员变量还是调用成员函数都没有任何区别。
有可能变化的情况是你再次new了一个,操作系统有可能把同一块地址再分配给你然后
你又做了其他的事情。还有一种可能就是等足够长的时间System Idle Process把这块
地址清0了。
把操作系统看作政府的话,可以简单的认为delete只是贴了一个拆迁的标签,表示这栋
房子以后可以随便拆了。贴标签后你再去访问里面的人,可能钉子户还在,因为没有人
赶他走,但是你不能保证每次去都能看到,因为指不定哪天操作系统就给你拆迁了。 |
|
N***m 发帖数: 4460 | 16 if you set cptr=null, you may still use it in some cases.
freelist |
|
U********d 发帖数: 577 | 17 你是对的,这里我写错了。设置cptr=null后调用f()中没有查什么虚函数表之类,函数
内部也没有成员变量调用,这个情况确实可以访问。
多谢指出。:) |
|
U***y 发帖数: 149 | 18 I am a newbie....
I run your code. but
the final output is
exist!
0
not the same as yours:
exist!
1
I changed Cptr->x=1000 or any other number
it always outputs like
exist!
0
Can anyone help explain?
Thansk... |
|
t********o 发帖数: 48 | 19 【 以下文字转载自 Programming 讨论区 】
【 原文由 tsingditto 所发表 】
这个header有问题么?
为什么每次include的时候,都说我:
'struct CSCMatrix' declared inside parameter list,
its scope is only this definition or declaration, which is probably not what
you want
#ifndef CAPLOT_H
#define CAPLOT_H
typedef struct
{
int nrow;
int ncol;
int nnz;
int *colptr;
int *rowind;
double *nzval;
double *dx;
double *dy;
} CSCMatrix;
extern double bmsize(int *rind, int *cptr,int m,int n);
extern void scale(struct CSCMatrix *csc);
extern void SAnetSVD( |
|
|