如果我确定它是在只读存储区中,那么复制const char ptr而不重新分配内存被认为是不好的做法吗?

时间:2015-11-23 08:50:00

标签: c++ c

即。我初始化一个如下的指针:

const char * ptr1 = "Hello";

然后我将第一个指针的内容分配给另一个指针,而不重新分配/复制内存,并将后者用于另一个函数:

const char * ptr2 = ptr1;

当我使用第二个时,第一个无法解除分配,对吧? 它也不能被修改。

唯一需要注意的是,我无法检查内存是否只读。

但如果我确定,内存是只读的,可能出现什么问题?

2 个答案:

答案 0 :(得分:2)

  

但如果我确定,内存是只读的,可能出现什么问题?

没有,因为字符串文字是存储在可执行文件中的文字,并且无法解除分配。

  

当我使用第二个时,第一个不能被释放,对吗?它   也无法修改。

多数民众赞成。

如需进一步解释,请执行此操作

const char * ptr1 = "Hello";

字符串的内容存储在的编译文件中,这意味着您无法解除分配,也无法进行任何优化/程序。

答案 1 :(得分:1)

由于您使用的是 const char*,因此无论指针指向字符串文字还是其他地方管理的其他缓冲区,您的问题基本上都无关紧要

此处的const表示您只能通过此指针读取,如果没有deletefree() const指针铸造。

对于字符串文字,您的const char * ptr2 = ptr1;是"安全"但是一般情况下它可能会有问题,因为:

std::string strval1("Foo Bar");
...
const char* ptr1 = strval1.c_str();
...
const char* ptr2 = ptr1;
...
strval1[0] = 'B';
// Both ptr1 and ptr2 point to the original string buffer, thus both now pointing to the modified "Boo Bar" string

还要注意,我故意只在上面就地修改了字符串,因为那是guaranteed to preserve the buffer( - > ...失效:...调用非const成员函数...,不包括 operator[]at(),... )。如果我附加到字符串,通过上面的.c_str()获得的指针将被无效。