2013-03-30 6 views
-1

Я узнал, что вы создаете место в куче с «новым», и вы должны явно освободить его с помощью «delete» в ОС Windows. Но теперь я должен сделать это на ОС Linux. Я просто понятия не имею. , напримерНекоторые вопросы о posix_memalign

char str[] = new char[512]; 
delete[] char; 

Что я должен сделать для ОС Linux? Думаю, я должен использовать posix_memalign, но я не знаю, как это сделать.

+0

Нет, это недействительно ... –

+5

Как вы наткнулись на 'posix_memalign', чтобы найти это? – delnan

ответ

3

Во-первых, ваш код не является действительным C или действительным C++.

Возможно, вы имели в виду:

char str* = new char[512]; 
delete[] str; 

который действует C++ (не C, потому что new и delete являются C ключевые слова ++, а не C них) и работает на Linux, как на Windows, или любой стандартной реализации C++.

Затем str выделяется в heap (и эта же программа выделяется в куче как на Windows, так и на Linux).

Нет необходимости в posix_memalign(3) (см. Справочную страницу, которую я только что связал) в вашем случае.

Возможно, вы захотите использовать posix_memalign, если по какой-то определенной причине вы хотите, чтобы указатель был выровнен, например. быть кратным 1024.

Этот пример является глупым, потому что он запрашивает выравнивание 1024 байтов для зоны памяти 512 байт.

Тогда пожалуйста

#define _GNU_SOURCE 
#include <new> 
#include <stdlib.h> 

, а затем в том же C++ исходный файл:

char* str = NULL; 
void* ad = NULL; 
if (posix_memalign(&ad, 1024, 512)) 
    { perror("posix_memalign failed"); exit (EXIT_FAILURE); } 
str = new(ad) char[512]; 

но вы должны иметь конкретную причину хотеть выровненный указатель (здесь, кратное 1KByte). Обычно вы не хотите, чтобы указатель был выровнен больше, чем значение по умолчанию. (Вам может потребоваться большое выравнивание, например, при выполнении арифметики на (intptr_t) отбрасывания ваших указателей, но это очень необычно). Обратите внимание на placement new (предоставляется стандартным заголовком <new>).

Я рекомендую читать Advanced Linux Programming (что более сфокусировано на C, чем на C++). И всегда компилируйте в Linux все предупреждения, запрошенные компилятором, и информацию об отладке (например, g++ -Wall -g). Научитесь использовать отладчик gdb и детектор утечки памяти valgrind.Если у вашей программы нет ошибок, попросите компилятор оптимизировать полученный код объекта с помощью g++ -Wall -O2 вместо g++ -Wall -g.

на самом деле, реальная syscalls сделано приложением к Linux kernel (чей список на syscalls(2)) для управления памятью mmap(2) и munmap(2) (и, возможно, sbrk(2) который почти устарел). Вы должны использовать команду strace, чтобы узнать, сколько системных вызовов выполняется процессом.

+0

Ahh, я пытаюсь построить сканер для моего компилятора (домашняя работа на самом деле ^^). Мой профессор сказал, что мы должны использовать posix_memalign для нашего буфера. Я думал, это потому, что это стандарт Linux. – nomnom

+1

Сделайте то, что требует учитель. 'posix_memalign' не является специфичным для Linux, он определен в стандарте POSIX. Но есть несколько веских причин требовать в значительной степени согласованного буфера .... –

1

Прежде всего, new[] и delete[] являются конструкциями C++, а не С.

Они доступны на любом совместимом платформе, так что вы можете использовать их на Linux.

Обратите внимание: неверен синтаксис. Оно должно быть:

char *str = new char[512]; 
delete[] str; 

Если вы кодирования в C, а не C++, вы можете использовать malloc() и free().

Смежные вопросы