shared_ptr实现stock

博客介绍了C++中智能指针shared_ptr的使用。需注意包含<memory>头文件,其初始化有三种方式,分别是直接用new、使用make_shared函数和拷贝。还提及了实现相关,但未详细展开。

Tips

  • 需要注意#include< memoy >头文件。
  • shared_ptr和普通的指针用起来基本没啥区别,初始化有三种方式:
    1. shared_ptr< Obj > ptr(new Obj);
    2. shared_ptr< Obj > ptr = make_share< Obj >();
    3. 拷贝

实现

template <typename T>
struct Node{
    T data;
    shared_ptr<Node> next = nullptr;
};
template <typename T>
class Stack{
public:
    Stack():nodeLsit(nullptr){

    }
    void push(T val){
        shared_ptr<Node<T>> newNode(new Node<T>);
        newNode->data =val;
        newNode->next = nodeLsit;
        nodeLsit = newNode;
    }
    T pop(){
        shared_ptr<Node<T>> oldNode = nodeLsit;
        nodeLsit = nodeLsit->next;
        return oldNode->data;
    }
    bool isEmpty(){
        return nodeLsit == nullptr;
    }
    shared_ptr<Node<T>> nodeLsit;
};
在处理 `libcrypto.so.1.1` 的错误“cannot enable executable stack as shared object”时,通常意味着动态链接库的堆栈被标记为可执行,这在某些系统上可能被安全策略禁止。该问题常见于运行 OpenSSL 相关库的程序,尤其是在某些 Linux 发行版或容器环境中。 ### 错误原因 - **可执行堆栈限制**:某些系统通过 `GNU_STACK` 标记强制要求共享库的堆栈不可执行,以防止潜在的安全漏洞。 - **OpenSSL 配置或编译问题**:如果 OpenSSL 编译时启用了某些特性,可能会导致生成的 `libcrypto.so.1.1` 包含可执行堆栈。 ### 解决方案 #### 1. 修改共享库的堆栈标志 可以使用 `execstack` 工具来修改 `libcrypto.so.1.1` 的堆栈标志,禁用可执行堆栈: ```bash sudo apt install execstack # 安装 execstack execstack -c /path/to/libcrypto.so.1.1 # 清除可执行堆栈标志 execstack /path/to/libcrypto.so.1.1 # 检查是否已禁用可执行堆栈 ``` 此方法适用于临时修复问题,但不推荐在生产环境中长期使用,因为它可能会影响安全性。 #### 2. 重新编译 OpenSSL 如果使用的是自定义编译的 OpenSSL,可以在编译前通过配置禁用某些特性,以避免生成包含可执行堆栈的库。例如: ```bash ./Configure linux-x86_64 --prefix=/usr/local/openssl no-asm make sudo make install ``` 此外,可以在编译时使用 `-Wl,-z,noexecstack` 链接器选项,确保生成的共享库不启用可执行堆栈: ```bash LDFLAGS="-Wl,-z,noexecstack" ./Configure linux-x86_64 --prefix=/usr/local/openssl ``` #### 3. 使用静态链接 如果动态链接导致问题,可以考虑将 `libcrypto` 静态链接到应用程序中,从而避免共享库的堆栈问题。静态链接的 OpenSSL 可以通过以下方式构建: ```bash ./Configure linux-x86_64 no-shared --prefix=/usr/local/openssl-static make sudo make install ``` 然后在应用程序的编译命令中链接静态库: ```bash gcc -o myapp myapp.c /usr/local/openssl-static/lib/libcrypto.a ``` #### 4. 更新系统或容器配置 某些 Linux 发行版(如 CentOS、Ubuntu)可以通过修改内核或 SELinux/AppArmor 配置来允许可执行堆栈,但这通常不推荐,除非确认没有其他替代方案。例如,可以使用以下命令临时允许可执行堆栈: ```bash sudo setsebool -P allow_execstack=1 # SELinux 环境 ``` ### 验证修复 在完成上述修改后,可以使用 `readelf` 检查共享库的堆栈标志: ```bash readelf -l /path/to/libcrypto.so.1.1 | grep GNU_STACK ``` 如果输出为 `GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x00000 0x00000 RW 0x10`,则表示堆栈不可执行,问题已解决。 ### 注意事项 - 在生产环境中,建议优先使用重新编译 OpenSSL 并禁用可执行堆栈的方式,而不是直接修改现有库。 - 如果使用的是容器环境(如 Docker),确保在构建镜像时采用静态链接或修改编译参数。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值