Tại sao chỉ cấp phát cho con trỏ *b với 1 ô nhớ mà lại có thể trỏ tới ô nhớ thứ 4 và thứ 5 cạnh ô nhớ cấp phát ban đầu?

#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
	int *b;
	b = new int;
	*(b + 4) = 5;
	*(b + 5) = 5;
	cout<<endl;
	cout <<*(b+4);
	cout<<*(b+5)<<"\n";
        delete[] b;
	return 0;
}

Cho em hỏi tại sao em chỉ cấp phát cho con trỏ *b với 1 ô nhớ mà em lại có thể trỏ tới ô nhớ thứ 4 và thứ 5 cạnh ô nhớ cấp phát ban đầu ạ??

C/C++ không có bound checking :smiley: rất hạn chế mấy cái này vì đã lớn mạnh từ những năm 80.

4 Likes

bổ sung thêm ko có bound checking là vì C/C++ thích tốc độ hơn là an toàn :V

bổ sung thêm nữa nếu em muốn có bound checking với C++ thì xài std::vector, phương thức at(i) thay vì [i]

int n;
std::cin >> n;
std::vector<int> b(n); // mảng n phần tử

//std::cout << b[n] << "\n"; // undefined behavior: có thể gây lỗi, có thể ko
std::cout << b.at(n) << "\n"; // lỗi out_of_range

hoặc nếu số phần tử cố định thì xài std::array<int, 10> a thay cho int a[10] luôn :V

std::array<int, 10> a; // mảng 10 phần tử

//std::cout << a[10] << "\n"; // undefined behavior: có thể gây lỗi, có thể ko
std::cout << a.at(10) << "\n"; // lỗi out_of_range

đương nhiên xài at(i) chậm hơn [i] rất nhiều :V :V

à mà code em cấp phát new int; thì khi giải phóng xài delete chứ ko phải delete[] nha :V Chừng nào xài new int[n] thì mới xài delete[] tương ứng

7 Likes

Tức là bên C++ khi mình khai báo như trên thì khi giải phóng bộ nhớ thì em sẽ không giải phóng được hết các sao anh???

Phần delete em bị nhầm, em mới học con trỏ nên hơi mơ màng!!
Phần anh nói C++ thích tốc độ hơn là an toàn có nghĩa là sao anh?? Em tưởng nó chỉ bị tràn bộ nhớ đệm thôi …??

Vẫn đủ nhé bạn :smiley: không thiếu cân nào.

Quay lại những năm 80 :smiley: khi RAM hàng megabyte đã rất là oai.

4 Likes

Em không hiểu anh nói lắm!!@@…
Anh giải thích chút chút cho em được k?

5 posts were split to a new topic: Tại sao code bị std::bad_alloc

an toàn là ko được truy cập vào vùng nhớ nào chưa được cấp phát, lỡ vùng nhớ đó hệ điều hành đang xài thì sao :V C++ ko ktra vì nếu ktra sẽ mất 1 cái if, sẽ chậm hơn là ko xài if :V Em truy cập mảng a 1000 phần tử bằng a[i] ko mất 1000 cái if để ktra, còn xài a.at(i) thì mất thêm 1000 cái if :V Trong khi khi code em cho i chạy từ 0 tới 999 đã biết a[i] có nằm ngoài mảng a hay ko, vậy thêm if vào ktra lần nữa làm gì :V

vả lại bây giờ hệ điều hành nó cấp cho địa chỉ ảo để tránh truy cập vào địa chỉ thật hết rồi nên cũng ko cần thiết ktra lắm :V Nếu truy cập vùng nhớ nguy hiểm thì hệ điều hành nó báo lỗi thôi, còn truy cập trúng vùng nhớ chưa được cấp phát nhưng ko nguy hiểm thì có khi nó ko báo lỗi gì :V Bởi vậy mới gọi đó là hành vi ko xác định (undefined behavior), chạy 100 lần 99 lần ko sao nhưng tới lần thứ 100 em đem đi chấm điểm nó tiêu tùng em 0 điểm :V

4 Likes

Thường allocator sẽ không trả về đúng số byte đã request để allocate, nó sẽ pad thêm bytes để match word size của CPU. Tùy implementation nữa.

malloc(4)malloc(5) có thể vẫn sẽ trả về 3 bytes ngoài boundary của b.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?