inline int size() const noexcept { return int(d->end - d->begin); }读取访问权限冲突引发异常问题
时间: 2024-02-03 21:11:50 浏览: 26
这个函数的代码看起来并不会引发访问权限冲突的异常,因为它只是返回一个指针的差值,并没有修改任何数据成员。
但是,如果在调用该函数的上下文中,访问了一个私有成员变量,那么就有可能引发访问权限冲突的异常。比如:
```cpp
class MyClass {
private:
char* begin;
char* end;
public:
inline int size() const noexcept { return int(end - begin); }
void doSomething() {
// 以下代码试图访问私有成员变量 begin 和 end
// 这就可能引发访问权限冲突的异常
char* ptr = begin + 1;
int n = size();
char* ptr2 = end - 1;
// ...
}
};
```
如果在 `doSomething()` 函数中访问 `begin` 和 `end`,而 `begin` 和 `end` 又是私有成员变量,那么就有可能引发访问权限冲突的异常。解决方法是,在类的定义中增加 `friend` 声明或者提供公有的访问函数,让外部可以访问这些私有成员变量。
相关问题
class MDeviceInfo { public: MDeviceInfo(MChannelInfo* info) : channelInfo(info) , deviceParInfo() , dataInfo() { ; } MDeviceInfo() {}; ~MDeviceInfo(); QString name; QString describe; QStringList info; QStringList deviceParInfo; QStringList dataInfo[5]; MChannelInfo* channelInfo;}这个类实例化对象后static MDeviceInfo cpDeviceInfo; 关闭程序时报错inline int size() const noexcept { return int(d->end - d->begin); }引发了未经处理的异常:读取访问权限冲突。 this 是 0x1C。 问题原因如何改装
这个错误的原因可能是因为在程序退出时,`cpDeviceInfo` 对象被销毁,但是其成员 `channelInfo` 指针指向的对象可能在此之前已经被销毁了。当程序试图访问已经销毁的对象时,就会发生访问权限冲突的错误。
解决这个问题的方法是在 `MDeviceInfo` 的析构函数中,释放 `channelInfo` 指针指向的对象,以确保其在对象销毁时也被正确释放。例如:
```cpp
MDeviceInfo::~MDeviceInfo()
{
delete channelInfo;
}
```
另外,你在代码中出现了 `dataInfo[5]`,这似乎是一个数组,但是你在初始化列表中将其当做字符串列表来处理。如果你想要一个数组,可以这样定义:
```cpp
QStringList dataInfo[5];
```
但是需要注意的是,这样定义的数组大小是固定不变的,如果你需要动态改变数组大小,可以使用 `std::vector` 等容器代替数组。
_NODISCARD size_type size() const noexcept { return _Get_scary()->_Mysize; }
这是一个 C++ 的成员函数,返回当前对象所管理的内存块的大小(以字节为单位),即所分配的内存大小。该函数是 noexcept 的,表示它不会抛出任何异常。
该函数的实现是调用一个名为 `_Get_scary()` 的私有成员函数,该函数返回一个 `_Scary_val` 结构体的指针,该结构体保存着一些管理内存块的元数据,包括内存块的大小 `_Mysize`。因此,函数返回 `_Mysize` 的值即可。另外,该函数前面的 `_NODISCARD` 是为了告诉编译器,调用该函数后返回的值不应该被忽略,即应该被使用。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)