我正在尝试一些Scott Meyers Effective C ++的代码,特别是第3项。
他书中的代码应与此非常相似(他遗漏了构造函数)
#include <iostream>
class TextBlock {
public:
TextBlock(char* ptr) : ptrText(ptr)
{}
char& operator[](std::size_t pos) const {
return ptrText[pos];
}
private :
char* ptrText;
};
int main(int argc, char* argv[]) {
const TextBlock block("Hello");
std::cout << block[0] << std::endl;
char* ptr = &block[0];
*ptr = 'J';
std::cout << block[0];
}
在我更改指针ptr(* ptr ='J';)中的内容时,我得到一个分段错误(通常在解除引用未初始化或释放的指针时发生)。这不是在这里发生的,*ptr = 'J'
;
答案 0 :(得分:4)
TextBlock
没有任何存储空间。它指向内存"Hello"
中的常量字符串,并且您已尝试修改只读内容。
如果您声明了一个具有自己存储的局部变量,那么这将起作用,例如:
char test[32] ;
strcpy( test, "Hello") ;
const TextBlock block( test) ;
char * ptr= &block[0] ;
*ptr= 'J' ;
答案 1 :(得分:1)
你应该管理
ptrText
成员不是指向禁止写入的常量内存区域的指针,而是作为对可以完全控制的基于堆栈或基于堆的对象的引用。
您可以使用char数组
#include <iostream>
#define MAX_LENGTH = 1024
class TextBlock {
public:
TextBlock(char* ptr)
{
memset(ptrText, 0, MAX_LENGTH);
memcpy(ptrText, ptr, strlen(ptr) < MAX_LENGTH?strlen(ptr):MAX_LENGTH);
}
char& operator[](std::size_t pos) const {
return ptrText[pos];
}
private :
char ptrText[MAX_LENGTH];
};
答案 2 :(得分:0)
#include <iostream>
class TextBlock {
public:
TextBlock(char* ptr) : ptrText(ptr)
{}
char& operator[](std::size_t pos) const {
return ptrText[pos];
}
private :
char* ptrText;
};
int main(int argc, char* argv[]) {
char text[] = "Hello";
const TextBlock block(text);
std::cout << block[0] << std::endl;
char* ptr = &block[0];
*ptr = 'J';
std::cout << block[0];
}
答案 3 :(得分:0)