即。我初始化一个如下的指针:
const char * ptr1 = "Hello";
然后我将第一个指针的内容分配给另一个指针,而不重新分配/复制内存,并将后者用于另一个函数:
const char * ptr2 = ptr1;
当我使用第二个时,第一个无法解除分配,对吧? 它也不能被修改。
唯一需要注意的是,我无法检查内存是否只读。
但如果我确定,内存是只读的,可能出现什么问题?
答案 0 :(得分:2)
但如果我确定,内存是只读的,可能出现什么问题?
没有,因为字符串文字是存储在可执行文件中的文字,并且无法解除分配。
当我使用第二个时,第一个不能被释放,对吗?它 也无法修改。
多数民众赞成。
如需进一步解释,请执行此操作
const char * ptr1 = "Hello";
字符串的内容存储在的编译文件中,这意味着您无法解除分配,也无法进行任何优化/程序。
答案 1 :(得分:1)
由于您使用的是 const
char*
,因此无论指针指向字符串文字还是其他地方管理的其他缓冲区,您的问题基本上都无关紧要
此处的const
表示您只能通过此指针读取,如果没有delete
或free()
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()
获得的指针将被无效。