限制对stl :: vector元素的指针访问

时间:2017-05-05 19:04:19

标签: c++ stl

考虑案例

        <?php error_reporting(E_ALL); ini_set('display_errors', 1);

        if (mysqli_connect_errno()) { echo "Error: no connexion allowed : " . mysqli_connect_error($mysqli); } 
        ?>
        <?php
        include 'dbconnection.php';

        if(isset($_POST['selectstore'])) {
        $id = $_POST['id']; // Line 8

            $stmt = $mysqli->prepare("UPDATE stores SET records = records + 1 WHERE id = :id");

                $stmt->bindParam(':id', $id);   

            if ($stmt->execute()) { 
                $success = true;
            }

            $stmt->close();

            $mysqli->close();   
            if($success) {
                echo "Updated Succesfull";
            } else {
                echo "Failed: " .  $stmt->error;
              }
            }

        ?>

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

正如人们可以看到evne虽然它的工作原理很好,破坏分配器的抽象是可怕的。我如何阻止我的客户避免这样的事情。问题是有关C ++语言的功能。

1 个答案:

答案 0 :(得分:0)

你不能。 C ++语言旨在为程序员提供解决复杂问题的工具;它的设计并不是为了确保程序员能够使用这些工具在脚下射击自己(或者更确切地说:它不是围绕设计来牺牲解决复杂问题的能力而设计的通过使这些工具更安全使用)。

可以做的一件事是专注于确保您的 Public 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%阻止你的程序员做一些愚蠢的事情。你所能做的只是尝试证明界面,以便发现更多常见/简单的错误。