Посмотрим, что делает GCC 4.8 x86-64 Linux
Программа:
#include <cstdio>
int main() {
const char *s = "abc";
char *sn = new char[4];
sn[3] = '\0';
std::printf("%s\n", s);
std::printf("%s\n", sn);
}
Компилировать и декомпилировать:
g++ -ggdb -std=c++98 a.cpp
objdump -CSr a.o
Вывод содержит:
const char *s = "abc";
8: 48 c7 45 f0 00 00 00 movq $0x0,-0x10(%rbp)
f: 00
c: R_X86_64_32S .rodata
char *sn = new char[4];
10: bf 04 00 00 00 mov $0x4,%edi
15: e8 00 00 00 00 callq 1a <main+0x1a>
16: R_X86_64_PC32 operator new[](unsigned long)-0x4
1a: 48 89 45 f8 mov %rax,-0x8(%rbp)
Интерпретация:
char *s = "abc"
входит в .rodata
. Так что вы не можете free
это никак.
char *sn = new char[4];
поступает с выхода operator new[]
. Поэтому вы должны освободить его, когда сможете.