标签: shared-ptr

shared_ptr导致段错误

我正在尝试将shared_ptr与我的班级一起使用但由于某种原因我得到了段错误.也许我做的事情很愚蠢.

#include <tr1/memory>
#include <iostream>
class Dataset ;
typedef int DataClass;
class Dataset_Impl{
    friend class Dataset ;
    DataClass *dc;
    Dataset_Impl(){dc = new DataClass[10];}
    public:
    void getSubset(Dataset_Impl* &dObj){
        dObj = new Dataset_Impl();  //Causing segfault when using shared_ptr
        /*copy subset of 'dc' to dObj->dc and return*/std::cout<<"Copied subset";
    }
};
class Dataset{
    Dataset_Impl *d;
    public:
        Dataset (){};
        inline void const getSubset(Dataset &dObj) const{d->getSubset(dObj.d);}
};
int main(){
    Dataset m1,subset1;std::shared_ptr<Dataset> subset2;
    m1.getSubset(subset1);
    m1.getSubset((*subset2)); //Causing segfault
}
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr

0
推荐指数
2
解决办法
5951
查看次数

有没有办法安全删除MyObject的非唯一指针的QList?

我知道这个问题已被要求死亡,但我想知道是否有任何方式做我在问题中所说的而不使用Boost库指针等.基本上我有以下一段清理代码删除指向的对象通过二维QList中的指针(QList <QList>)

#include <QList>
QList< QList<MyObject*> > m_Data;
...
void CleanupMyObjectList
{
int numFrames = m_Data.size();
for(int i=0; i < numFrames; i++)
{
    int numObjects = m_Data.at(i).size();

    for(int j=0; j < numObjects; j++)
    {
        MyObject* removedObject = m_Data[i].at(j);
        if(removedObject != NULL)
        {
            delete removedObject;//This assumes that the pointers are UNIQUE in this list!!! If not it will crash!!!
            removedObject = NULL;
        }
    }
    m_Data[i].clear();

}

m_Data.clear();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试清理由非唯一或共享(这是正确的术语?)指针填充的列表时,它确实崩溃了,例如当m_Data [0] [1]等于m_Data [1] [1]时.

我知道为什么它崩溃所以请保存解释,但我想知道是否有安全删除这些对象尽可能少的代码修改.

c++ qt list shared-ptr

0
推荐指数
1
解决办法
1144
查看次数

通过C++中的指针在对象之间共享数据

我有几个通过指针共享数据的对象.指针参数是在构造函数中发送的,如下所示.

class A
{
public:
    Shared* pB = new Shared();
    User* object1 = new User(pB);
    User* object2 = new User(pB);
}

class User
{
public:
    User(Shared* pB) {m_sharedB = pB};
private:
    Shared* m_sharedB;
}
class Shared
{
public:
    struct Account 
    {
        int account_number;
    }
    void method(){...};
}
Run Code Online (Sandbox Code Playgroud)

我的问题与C++析构函数有关.当object1被删除时,成员变量"m_sharedB"会发生什么?是否存在悬挂指针给其他同行的问题?

c++ constructor destructor shared-ptr

0
推荐指数
1
解决办法
1162
查看次数

传递shared_array <T>参数

下面的代码在取消注释时崩溃,似乎get()中的shared_array <>参数有问题.

print()似乎至少暂时没有崩溃......

传递shared_array <>参数的正确方法是什么?

#include <iostream>
#include <cstring>
#include <boost/shared_array.hpp>
using namespace std;
using namespace boost;

shared_array<wchar_t> get(const wchar_t* s) {
//shared_array<wchar_t> get(const shared_array<wchar_t>& s) {

    size_t size = wcslen(s);
    //size_t size = wcslen(s.get());

    shared_array<wchar_t> text(new wchar_t[size+1]);

    wcsncpy(text.get(), s, size+1);
    //wcsncpy(text.get(), s.get(), size+1);

    return text;
}

void print(shared_array<wchar_t> text) {
    wcout << text.get() << endl;
}

int wmain(int argc, wchar_t *argv[]) {
    //shared_array<wchar_t> param(argv[1]);

    shared_array<wchar_t> text = get(argv[1]);
    //shared_array<wchar_t> text = get(param);

    print(text);
    //print(text.get()); 
}
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢.所以关键在于我在使用boost :: shared_ptr/array时应该总是只使用new/new []. …

c++ boost pointers shared-ptr

0
推荐指数
1
解决办法
509
查看次数

C++:std :: shared_ptr <T>和std :: shared_ptr <T const>有什么区别?

std::shared_ptr<T>和之间有什么区别std::shared_ptr<T const>

什么时候你会使用一个与另一个?

c++ shared-ptr

0
推荐指数
1
解决办法
170
查看次数

关于shared_ptr

只是想澄清一下shared_ptr

int main(){
   typedef std::tr1::shared_ptr<Foo> _foo;

   _foo obja(new Foo());
   Foo *objb = obja.get(); 

   // delete objb; //deleting objb will throw double free or corruption
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,如果未删除或释放objb,是否存在内存泄漏?最终,obja将超出范围并将自由.由于objbobja指向同一个实例,这意味着没有必要释放objb

以上是否与此相同:

Foo *obja = new Foo();
Foo *objb;

objb = obja;
delete obja;
Run Code Online (Sandbox Code Playgroud)

c++ pointers shared-ptr

0
推荐指数
1
解决办法
113
查看次数

在指针向量上排序更改向量副本中的数据?

我有一个指向对象的指针向量,并且在某些时候,使用该向量的子元素创建第二个向量.现在,对原始向量进行排序会更改第二个向量中的元素(排序后其中的元素完全不同).

这是预期的行为吗?它与make_indirect_iterator有关吗?有没有更好的解决方案(假设我想保留一个指针向量)?

std::vector<std::shared_ptr<MyObj>> vecAll;
std::vector<std::shared_ptr<MyObj>> vecSub;

// fill vecAll with something...

for(auto obj : vecAll) {
    if( obj->x >=0 ) {
        vecSub.push_back(obj);
    }
}

// 3 objects in 'vecSub'

std::sort(boost::make_indirect_iterator(vecAll.begin()), boost::make_indirect_iterator(vecAll.end()), std::greater<MyObj>());

// now there are 3 DIFFERENT objects in 'vecSub'
Run Code Online (Sandbox Code Playgroud)

c++ boost stl shared-ptr c++11

0
推荐指数
1
解决办法
689
查看次数

全局变量没有增加(是gcc坚果吗?)

我有以下愚蠢的代码:IDEONE

有人可以解释,为什么删除std :: vector中的对象A时全局计数器不会增加?

#include <iostream>
#include <memory>
#include <vector>

int global;

class A {
public:
    A(int i): a(i) {}
    ~A() {
        std::cout << "delete A" << std::endl;
        ++global;
    };
    int foo() {
        return a;
    }
    int a;
};


int main() {


        int c = 0;
        int loops = 10;
        global = 0;

        // Make vector of pointers
        std::vector<std::shared_ptr<A> > vec;
        for(int i = 0; i< 10; i++) {
            vec.push_back( std::shared_ptr<A>(new A(i))    );
        }

        for(int i=0; i<loops; i++) { …
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr c++11

0
推荐指数
1
解决办法
54
查看次数

智能指针作为条件:是(p)和if(p.get())equilavent?

让我们p成为共享/唯一指针.是if (p)if (p.get())相同呢?

如果不是,这些条件或条件中的代码在什么情况下表现不同?

cppreference我读到std::shared_ptr::operator bool检查是否get() != nullptr.这是确切的实施operator bool吗?

c++ smart-pointers shared-ptr unique-ptr c++11

0
推荐指数
1
解决办法
125
查看次数

c ++ shared_ptr&memcpy错误

我已经决定转向现代的c ++实践,我试图调整我的旧代码来使用智能指针.我有一个数据包类,包含数据包数据,以及其他一些变量.

class Packet
{
public:
    Packet(int connId, std::shared_ptr<char[]> buff, size_t pLen) 
        : connID(connId), packetLen(pLen)
    {
        buffer = buff;
    }

    Packet(){}

    int connID;
    size_t packetLen;
    std::shared_ptr<char[]> buffer;
};
Run Code Online (Sandbox Code Playgroud)

我有一个测试功能,可以在新分配的缓冲区中创建和插入数据.

std::vector<Packet> packetV;

void createPacket()
{
    std::shared_ptr<char[]> data = std::make_shared<char[]>(10);

    for (int i = 0; i < 5; ++i)
    {
        uint8_t byte = 5;
        memcpy(*data.get() + i, &byte, sizeof(uint8_t));
    }

    packetV.push_back(Packet(1, data, 5*sizeof(uint8_t)));
}

//(Main function)
void main()
{
    std::string input;
    do
    {
        std::cin >> input;
        if (input == "packet") createPacket();
        else …
Run Code Online (Sandbox Code Playgroud)

c++ smart-pointers shared-ptr

0
推荐指数
1
解决办法
1216
查看次数

标签 统计

c++ ×10

shared-ptr ×10

c++11 ×3

boost ×2

pointers ×2

smart-pointers ×2

constructor ×1

destructor ×1

list ×1

qt ×1

stl ×1

unique-ptr ×1