std::vector<cocos2d::Sprite* > m_iDange ;怎么释放内存!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std::vector<cocos2d::Sprite* > m_iDange ;怎么释放内存!相关的知识,希望对你有一定的参考价值。

Sprite 在cocos中本来就有自动释放池,我在释放m_iDange 时,是需要想常规指针new出对象一样,通过
for(std::vector<__Array*>::iterator it = m_VARpgBase.begin(); it != m_VARpgBase.end(); it++)

delete *it;

这样将指针所指向的内存释放,
还是m_iDange.shrink_to_fit();
释放掉vector 里面指针的内存就行,然后等待自动释放池,自动释放?

参考技术A 你需要手动释放容器里面指针指向的内存,如析构函数

如何将 std::vector<std::vector<double>> 转换为 torch::Tensor?

【中文标题】如何将 std::vector<std::vector<double>> 转换为 torch::Tensor?【英文标题】:How is it possible to convert a std::vector<std::vector<double>> to a torch::Tensor? 【发布时间】:2020-12-07 12:48:48 【问题描述】:

我有一个 std::vector&lt;std::vector&lt;double&gt;&gt;,我想在 libtorch 中将其转换为 torch::Tensor。但是,torch::tensor()torch::from_blob() 似乎不能用于此目的!

我尝试使用c10::ArrayRef,然后使用它通过c10::ArrayRef&lt;std::vector&lt;std::vector&lt;double&gt;&gt;&gt; res(myvecs) 将数据转换为torch::Tensor,但这似乎也没用,因为我似乎找不到将其转换为torch::Tensor 的方法.

我应该如何在 libtorch 中进行这种转换?除了例如,我还有什么其他选择:

auto tensor = torch::zeros( 46,85 );
for (size_t i = 0; i < 46; i++)

   for (size_t j = 0; j < 85; j++)
   
       tensor[i][j] = probs[i][j];
   

【问题讨论】:

【参考方案1】:

最简单的方法是使用简单的std::vector&lt;double&gt; 而不是向量的向量。您将拥有连续的内存,并且 torch::from_blob 可以工作(如另一个答案中所述)。

如果这不可能/不方便,我建议采用以下解决方法。我假设您的向量是(n,m) 矩阵(即所有n 向量的大小都相同m):

int n = 5, m = 4;
// Just creating some dummy data for example
std::vector<std::vector<double>> vect(n, std::vector<double>(m, 0)); 
for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
        vect[i][j] = i+j;

// Copying into a tensor
auto options = torch::TensorOptions().dtype(at::kDouble);
auto tensor = torch::zeros(n,m, options);
for (int i = 0; i < n; i++)
    tensor.slice(0, i,i+1) = torch::from_blob(vect[i].data(), m, options);

编辑:您可能需要添加对clone 的调用,以防您无法确保向量的寿命超过张量(因为from_blob 不拥有所有权,因此当向量被销毁时其数据将被删除)

【讨论】:

非常感谢 这与简单的 for 循环相比如何?这里有任何并行化/优化吗?还是他们只是表现相同 谢谢。显然完全忘记了from_blob。非常感谢它 嗯,你需要一个基准来确定这一点,但我相信它应该比手动制作的 for 循环更快。大多数火炬操作都依赖于 BLAS,这比您手动执行的任何操作都高效得多(但是这是一个非常简单的操作:一个向量复制到另一个向量中,因此 BLAS 优化在这里并没有那么大)。除此之外,如果您首先将 2D 向量复制到 1D 向量中然后使用from_blob,则每个元素将被复制两次,而不是在我的答案中只复制一次。 谢谢,非常感谢。顺便说一句,如果我要将您的方法推广到更高维度的向量,例如 shape = (1,2,4,6)。在那种情况下,我应该怎么做?我应该先将它们展平为 1d,然后再使用 from_blob? 在这种情况下,简单的概括是循环前 3 个维度(而不是我这里的 1 个 for 循环)并像我在这里所做的那样切片。但是,我相信使用向量的向量 ... 会很快变得非常丑陋,因此您可能最好考虑使用具有连续内存的另一种数据结构。比如一个平面的一维向量【参考方案2】:

我没有使用过你提到的任何库,但如果我猜的话,这些库可能需要一个连续的数组,而不是散布在堆周围的小段内存。

所以将std::vector&lt;std::vector&lt;double&gt;&gt; 转换为std::vector&lt;double&gt; 并将vec.data() 指针传递给torch

std::vector<double> linearize(const std::vector<std::vector<double>>& vec_vec) 
    std::vector<double> vec;
    for (const auto& v : vec_vec) 
        for (auto d : v) 
            vec.push_back(d);
        
    
    return vec;

【讨论】:

非常感谢。非常感谢您的时间和善意的回应

以上是关于std::vector<cocos2d::Sprite* > m_iDange ;怎么释放内存!的主要内容,如果未能解决你的问题,请参考以下文章

C++随机选择std::vector的非空元素<std::vector>>

如何将 std::vector<std::vector<double>> 转换为 Rcpp::Dataframe 或 Rcpp::NumericMatrix

错误:没有匹配函数调用‘std::vector<std:

std::vector<std::array<T, N>> 或 std::array<std::vector<T>,N> 类型的数组如何存储在内存中?

这段代码安全吗?将 std::vector<Derived*> 强制转换为 std::vector<Base*>

std::vector::iterator失效性分析