Nó chạy đúng là ăn may thôi, tùy chương tình dịch, option và tình trạng máy lúc chạy.
May ở chỗ là delete(a) nó không gán a=null mà chỉ giải phóng vùng nhỡ đã cấp phát cho a. Như vậy, nếu không ghi gì vào đó thì dữ liệu trong a vẫn còn nguyên. delete(a) chỉ tạo điều kiện đề lệnh new tiếp theo có thể dùng vùng đó. Tùy, nếu máy dùng đến ùng nhớ đó thì sau del vẫn in được. Nhưng del cho phép mã lệnh sau dùng vùng nhớ đó nên không biết lúc nào dữ liệu bị mài đi.
Đấy là những điều sai, nó ăn may thì kệ nó nhưng tuyệt đối không được dùng.
Còn đây là kết quả tôi chạy
Code:
@¡y2@¡y2
Chchchchchchchchchchchchc
Chchchchchchchchchchchchc
ở đây, bạn delete [] a; sau lệnh này dữ liệu hỏng đi đi chứ không gán a=null, nên xuất hiện chuỗi rác ở đầu.
Còn đoạn sau, b được cấp phát đúng vào a, nên b==a.
Nếu sửa như sau thì theo dõi được ngay, không thì chạy step over
Code:
//---------------------------------------------------------------------------
#pragma hdrstop
#include <stdio.h>
#include <string>
#include <string.h>
#include <conio.h>
using namespace std;
char *a,*b;
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
char k[] = "Kiem tra thoi!";
printf("truoc new pointer a: %p\n",a);
a=new char [10];
strcpy(a,"anh");
printf("truoc del chuoi a: %s pointer a %p\n",a,a);
delete a;
printf("sau del chuoi a: %s pointer a %p\n",a,a);
b=new char [100];
strcpy(b,"Chchchchchchchchchchchchc");
printf("co b chuoi a: %s pointer a %p\n",a,a);
printf("co b chuoi b: %s pointer b %p\n",b,b);
getch();
return 0;
}
Kết quả đây:
truoc new pointer a 00000000 //null
truoc del chuoi a: anh pointer a 00843DAC
sau del chuoi a: @¡y2@¡y2 pointer a 00843DAC
co b chuoi a: Chchchchchchchchchchchchc pointer a 00843DAC
co b chuoi b: Chchchchchchchchchchchchc pointer b 00843DAC
Bookmarks