Cấp phát động không dùng new?

Chào mọi người, em có một bài tập code liên quan đến mảng, nhưng tụi em bị block từ khóa new nên không thể cấp phát động bằng toán tử new được. Nhưng max mảng có thể lên tới 1000 phần tử lận nên em không muốn tốn bộ nhớ.

Không biết là em dùng cách ở dưới thay thế có được không ạ? :sweat_smile:

// ...
int n; cin >> n; int const x = n;
int m; cin >> m; int const y = m;

int a[x];
inputArray(a, x);
int b[y];
inputArray(b, y);
int const p = x + y;
int c[p];
// ...

Nhưng max mảng có thể lên tới 1000 phần tử … không muốn tốn bộ nhớ

Bạn có hiểu những gì bạn đang nói không? Cấp phát bộ nhớ mà không tốn bộ nhớ?

Bạn pass đoạn code này vào IDE C++ chạy được là biết được, mà không được là biết không được thôi mà.


Nếu không dùng new thì có thể dùng malloc để cấp phát.

2 Likes

Dạ cảm ơn sự gợi ý của anh, ý em là sẽ có một số trường hợp mảng chỉ cần dùng khoảng 10-20 phần tử nên việc cấp 1000 phần tử ngay từ đầu thì nó bị phí rất nhiều bộ nhớ ấy ạ :3 nên đó là lý do em đang muốn dùng cấp phát động hơn là tĩnh.

Còn đoạn code này thì em chạy trên các IDE bình thường nhưng mà em sợ là nó không “chính thống” như đoạn code dưới á anh

int n; cin >> n;
int a[n];

bạn có thể dùng std::vector của STL, muốn dùng bao nhiêu thì push vào bấy nhiêu, phần cần cấp phát động bao nhiêu thì thư viện std::vector sẽ lo.

https://www.cplusplus.com/reference/vector/vector/push_back/


Còn về đoạn code này:

int n; 
cin >> n;
int a[n];

Bạn tham khảo ở đây.

2 Likes

Đây là bài tập để luyện kĩ năng code chứ có phải bài tập về dùng thư viện đâu.
Ps: nếu block toán tử new thì chắc vẫn cho dùng alloc nhỉ

3 Likes

À, em quên là bài tập này cũng block keyword include, nên chắc không dùng thư viện khác được ngoài iostream, mà mấy lệnh malloc thì nó nằm bên thư viện cstdio nên không dùng được luôn á anh :frowning:

Vậy chắc là bài tập này bắt buộc em phải dùng mảng tĩnh rồi :sweat_smile:

Cấp phát động không dùng thư viện, không dùng new, malloc ?
Chả có cách nào cả.

Cái này :

int n; cin >> n;
int a[n];

nó không có trong C++ tiêu chuẩn. Nó là cái gọi là VLA của C và một số compiler đã tích hợp nó từ C. Do không phải tiêu chuẩn nên nó chỉ tính là “lệ làng” chỗ chạy chỗ không. Nếu đồng thuận với nhau coi đó là một giải pháp thì cũng được.

2 Likes

Nếu vậy thì chỉ còn dùng mảng tĩnh thôi, có thể tự làm một bộ allocator đơn giản để quản lý vùng nhớ không được giải phóng.

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

#define MEM_POOL_SIZE 1048576

class Allocator
{
public:
	Allocator()
		: used(0)
	{
		std::memset(mem_pool, 0, MEM_POOL_SIZE);
	}
	
	~Allocator()
	{
		
	}
	
	void* allocate(int size)
	{
		if (used + size > MEM_POOL_SIZE)
			return nullptr;
			
		used += size;
		return (void*)(mem_pool + used + 1);
	}

private:
	char mem_pool[MEM_POOL_SIZE];
	int used;
};

int main() 
{
	Allocator A;
	int *arr = (int*)A.allocate(10 * sizeof(int));
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 1;
	}
	
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	
	return 0;
}
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?