使用本地数组作为存储时,带有std字符串参数的模板类给出分段错误

这是程序

alter procedure usp_imagetest
as
begin

select *,CancellationImagePath = 'F:\imagefolder\' + CancellationImage 
from tblImageTest

end

上面的程序可以编译,并且当参数为int类型时也可以正常工作。 但是当我将参数设置为std :: string时,它崩溃了-head-> data = data;

是我必须明确处理std :: string的事情。

谢谢。

tianjing_anbey 回答:使用本地数组作为存储时,带有std字符串参数的模板类给出分段错误

您告诉编译器将数组storage视为Node结构。但是storage中的数据没有进行任何初始化,其内容是不确定的,并且以任何方式使用都会导致未定义的行为

更具体地说,“结构”的成员没有构造或初始化,因此尝试将成员data用于任何复杂的事情(如您的情况)很可能导致崩溃。

简单的解决方案是使用展示位置new

head = new (storage) Node;

请注意,放置new后不能delete对象,需要显式调用析构函数

head->~Node();
,

您对未初始化的内存进行操作。尤其是您尝试实现自己的内存管理,这将导致99%的实现失败。

您只需在创建的类中使用newdelete,就不必再担心存储空间了。

#include <string>

template <typename T>
struct Node {
    T data;
    Node *next;
};

template <typename T>
class Test
{
public:
    Test() {
        head = new Node<T>();
    }

    ~Test() {
        delete head; head = nullptr;
    }

    void setData(T data) {
        if (head = nullptr) {
            head->data = data;
        }
    }
private:
    Node<T>* head = nullptr;
};

int main() {
    Test<std::string> test_string;
    Test<int> test_int;
    test_string.setData("Hello");
    test_int.setData(1);
    return 0;
}

重要说明:

  • Test的构造函数中,将分配内存
  • 对于每个new,必须有一个delete。所以请注意析构函数
  • 为实现良好的防御性,请始终检查指针是否为nullptr
  • 为了获得更好的代码风格,请不要使用using namespace std;。如果这样做,您将open变成一个很大的名称空间,该名称空间可能会与您的某些类名或函数名冲突。此错误几乎找不到。

免责声明:这适用于MSVC2017。

奖励

对于更现代的c++,您可以使用std::unique_ptr

#include <string>
#include <memory>

template <typename T>
struct Node {
    T data;
    Node *next;
};

template <typename T>
class Test
{
public:

    void setData(T data)
    {
        if (head = nullptr)
        {
            head->data = data;
        }
    }
private:
    std::unique_ptr<Node<T>> head = std::make_unique<Node<T>>();
};

int main()
{
    Test<std::string> test_string;
    Test<int> test_int;
    test_string.setData("Hello");
    test_int.setData(1);
    return 0;
}
本文链接:https://www.f2er.com/3139483.html

大家都在问