2017-05-05 114 views
0

考慮的情況下限制指針訪問STL ::向量元素

std::vector<int> v = {0,1,2,3,4,5} ; 
myOpenCLApi(&v[0]);  

其中作爲myOpenCLApi(void* ptr);

正如人們可以看到evne雖然它的工作原理分配就好了破抽象是可怕的。我如何阻止我的客戶避免這種情況。問題與C++語言功能有關。

+0

你真的不能。有志者,事竟成。 – NathanOliver

+0

這是不可能的。 –

+0

如何創建一個有用的工具,如鋼鋸,並完全防止其用戶危險地使用它? – WhiZTiM

回答

0

你不行。 C++語言是爲了給程序員提供工具來解決複雜問題而設計的。它並不是圍繞確保程序員無法使用這些工具在腳中自我射擊來設計的(或者更確切地說:它並不是圍繞設計的,通過使這些工具更安全地使用來犧牲解決複雜問題的能力)。

有一件事你可以要做的就是專注於確保您的公共API是儘可能的安全使用。就你而言,雖然使用場景不是100%清晰,但看起來你正在做的是將數據複製到OpenCL API中,然後在顯卡上使用,而且你不希望出現這種情況程序員必須手動計算出傳遞數據所需的指針算術。

這個最簡單的版本將是這個樣子:

template<typename T> 
void copyDataToOpenCL(std::vector<T> const& vec) { 
    //There are other things you'll need to do if you're going to use a non-blocking write instead. 
    size_t size = vec.size() * sizeof(T); 
    clEnqueueWriteBuffer(queue, buffer, true, 0, size, vec.data(), 0, nullptr, nullptr); 
} 

/*...*/ 

std::vector<int> v = {0,1,2,3,4,5}; 
copyDataToOpenCL(v); 

這樣,你的程序員不必直接與向量,這使得事情更加安全的底層存儲結構接口。是的,在事物的底層方面,你仍然在操縱原始指針和數據大小,但是你的程序員在使用這些代碼時不會犯錯。

當然不過,你仍然程序員可以打破這樣的:

std::vector<int> vals = {0,1,2,3,4,5}; 
std::thread ruiner{[&vals]{ 
    while(true) { 
     vals.emplace_back(vals.back() + 1); 
    } 
}}; 
copyDataToOpenCL(vals); 

但是,事情是這樣的:你不能100%防止你的程序員從做一些愚蠢的事。你所能做的就是試着證明界面,以便發現更多常見/簡單的錯誤。